Я новичок на stackoverflow.com, но я часто использовал его для поиска ответов всякий раз, когда у меня возникала проблема, но теперь я не могу найти никаких результатов поиска по моей проблеме, поэтому я спрашиваю здесь :) Я учусь на Сертификация OCPJP SE 7, экзамен 1Z0-804, и я использую книгу (есть только одна доступная, на самом деле, книга Ганеша\Шармы). и интерфейс Comparable для сортировки массива элементов Student, но вопрос касается Comparator:
import java.util.*;
class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
}
class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new StudentCGPA());
System.out.println(Arrays.toString(students));
}
}
Таким образом, он создает новый класс только для использования интерфейса Comparator с двумя объектами Student, но я думаю, что это очень неудобно, поэтому я задаюсь вопросом: почему я не могу использовать вложенный класс (внутри Student)? Нравится:
import java.util.*;
class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
static class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
}
class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new Student.StudentCGPA());
System.out.println(Arrays.toString(students));
}
}
В книге ничего не говорится об использовании вложенных классов вместо обычных, но я не понимаю, почему это должно быть плохо... Есть ли проблема с моим кодом (вторым)? Должен ли я следовать тому, что написано в книге, потому что моя реализация Comparator неверна? (Примечание: код компилируется и запускается без проблем, с ожидаемым результатом в обоих случаях)
[cs012 Harrison 2.7, cs011 Lennon 3.1, cs021 McCartney 3.4, cs022 Starr 3.7]
Пожалуйста, помогите: D Заранее спасибо.
Comparator
, рекомендуется поместить его исходный код в отдельный файл. Это не аргумент за или против вложенности классаComparator
. Весьма вероятно, что книга, из которой взят первоисточник, представляет его так, как это делается для удобства и ясности. - person John Bollinger   schedule 07.10.2014