Fan*_*nta 19 java sorting oop encapsulation list
我的实体类看起来像这样:
public class Student {
private int grade;
// other fields and methods
}
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
List<Student> students = ...;
Run Code Online (Sandbox Code Playgroud)
我如何排序students的grade,考虑到这是一个私人领域?
sla*_*dan 42
你有这些选择:
grade可见gradeComparator 内部 StudentStudent工具Comparable解决方案示例3:
public class Student {
private int grade;
public static Comparator<Student> byGrade = Comparator.comparing(s -> s.grade);
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
List<Student> students = Arrays.asList(student2, student3, student1);
students.sort(Student.byGrade);
System.out.println(students);
Run Code Online (Sandbox Code Playgroud)
这是我最喜欢的解决方案因为:
Comparators解决方案示例4:
public class Student implements Comparable {
private int grade;
@Override
public int compareTo(Object other) {
if (other instanceof Student) {
return Integer.compare(this.grade, ((Student) other).grade);
}
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以按到处是这样的:
List<Student> students = Arrays.asList(student2, student3, student1);
Collections.sort(students);
System.out.println(students);
Run Code Online (Sandbox Code Playgroud)
这个解决方案的方面:
grade表示学生的自然顺序TreeMap)通常,如果您需要一个取决于学生成绩的行为,则必须可以访问此信息 - 添加允许其他代码访问它的方法或属性.
因此,最简单的解决方法是:
public class Student implements IStudent {
...
private int grade;
...
// other fields and methods
public int getGrade() {
return grade;
}
}
Run Code Online (Sandbox Code Playgroud)
你应该扩展接口IStudent:)
但是,如果您只需要进行排序,则可以使用其他答案中已经提出的想法:实现Comparable界面.这样你可以保持grade隐藏,并在int compareTo方法中使用它.
JDK 1.8提供的选项是使用stream库sorted()方法,该方法不需要Comparable实现接口.您需要为字段实现accessor(getter)方法grade
public class Student {
private int grade;
public int getGrade() {
return grade;
}
public Student setGrade(int grade) {
this.grade = grade;
return this;
}}
Run Code Online (Sandbox Code Playgroud)
然后给出unsortedStudentList你可以像下面的代码一样对它进行排序:
List<Student> sortedStudentList = unsortedStudentList
.stream()
.sorted(Comparator.comparing(Student::getGrade))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
此外,sorted()方法还允许您根据其他字段(如果有)对学生进行排序.例如,考虑一个name学生的字段,在这种情况下,您希望根据年级和名称对studentList进行排序.所以Student上课会是这样的:
public class Student {
private int grade;
private String name;
public int getGrade() {
return grade;
}
public Student setGrade(int grade) {
this.grade = grade;
return this;
}
public String getName() {
return name;
}
public Student setName(String name) {
this.name = name;
return this;
}}
Run Code Online (Sandbox Code Playgroud)
要根据这两个字段进行排序:
List<Student> sortedStudentList = unsortedStudentList
.stream()
.sorted(Comparator.comparing(Student::getGrade)
.thenComparing(Comparator.comparing(Student::getName)))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
当第一个比较器比较两个相等的物体时,第二个比较器发挥作用.