[英]Custom sort using comparator in java
我办公室里的一位建筑师告诉我,比较器和可比较器之间的区别是; 比较器在两个不同的类对象之间进行比较,而在同一个类中进行比较。 我有一个班级实习生和另一个学生班级。 我想同时在“学生”和“实习生”班级中对姓名进行排序。 学生的名字很少,而实习生的名字很少。 想要以自然顺序对所有这些名称进行排序。 这有可能实现吗? 以下是我的错误代码。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Student {
String empName;
Student(String empName) {
this.empName = empName;
}
}
class Trainee {
String studName;
Trainee(String studName) {
this.studName = studName;
}
}
public class Sort implements Comparator {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student st = new Student("caroline");
Student st1 = new Student("elley");
Student st2 = new Student("fannah");
Trainee tr = new Trainee("aundh");
Trainee tr1 = new Trainee("Rohit");
Trainee tr2 = new Trainee("Shammi");
List list = new ArrayList<>();
list.add(st);
list.add(st1);
list.add(st2);
ArrayList list2 = new ArrayList<>();
list2.add(tr);
list2.add(tr1);
list2.add(tr2);
Collections.sort(Student, new Comparator<Trainee>() {
@Override
public int compare(Student s, Trainee t) {
// TODO return 1 if rhs should be before lhs
return s.empName.compareToIgnoreCase(t.studName);
}
});
}
}
这样做有一种肮脏的方式,这会导致代码非常不可读并显示出不良的设计
public class NameComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Student s1 = o1 instanceof Student ? (Student)o1 : null;
Student s2 = o2 instanceof Student ? (Student)o2 : null;
Trainee t1 = o1 instanceof Trainee ? (Trainee)o1 : null;
Trainee t2 = o2 instanceof Trainee ? (Trainee)o2 : null;
String st1 = s1 != null ? s1.empName; t1 != null ? t1.studName; null;
String st2 = s2 != null ? s2.empName; t2 != null ? t2.studName; null;
return st1 != null ? st1.compareTo(st2): 0;
}
}
更好的选择是在层次结构中使用公共接口或对象,并从该公共对象派生学生和受训者。
我怀疑您为此需要一个比较器。 默认情况下,字符串将以自然顺序排序。
list = Collections.sort(list);
list2 = Collections.sort(list2);
应该给你你想要的。
您编写的比较器没有任何意义,也不会编译。 这两个参数必须属于同一类。 它用于订购单个列表,而不是相对于彼此的列表。
这个
Collections.sort(Student, new Comparator<Trainee>() {
应该
Collections.sort(list2 , new Comparator<Trainee>() {
那就是您说的是使用我给您的比较方法对我的受训者列表进行排序。
您不对培训生类进行排序,而是对培训生实例的集合进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.