假设我有两个比较器,一个是主比较器,另一个是次要比较器。如何通过主比较器和次要比较器对数组进行排序?
假设每个对象都有一个名称和一个数字字段。
例如:
Bob 1
Bob 2
Jack 1
Jack 2
不创建新的比较器,是否可能实现?
假设我有两个比较器,一个是主比较器,另一个是次要比较器。如何通过主比较器和次要比较器对数组进行排序?
假设每个对象都有一个名称和一个数字字段。
例如:
Bob 1
Bob 2
Jack 1
Jack 2
不创建新的比较器,是否可能实现?
是的,您可以在不创建新比较器的情况下完成排序。
有一个众所周知的技巧可以按主要字段、次要字段、三级字段等进行排序:首先按最不重要的字段(三级字段)排序,然后按下一个重要的字段(次要字段)排序,最后按最重要的字段(主要字段)排序。但是,排序算法需要是稳定的才能正常工作。
如果您正在对数组进行排序,请使用Arrays.sort()
。如果您正在对List
进行排序,请使用Collections.sort()
。这两种方法都保证是稳定的。
假设您的主比较器对象存储在变量primaryComp
中,次要比较器对象存储在secondaryComp
中。那么这里是一些代码来完成您想要的:
Arrays.sort(mylist, secondaryComp); // This must come first!
Arrays.sort(mylist, primaryComp);
假设您的类是
class X {
String name;
int num;
}
那么排序将会发生
Arrays.sort(x, new Comparator<X>() {
@Override
public int compare(X o1, X o2) {
if (o1.name.equals(o2.name)) {
return Integer.compare(o1.num, o2.num);
}
return o1.name.compareTo(o2.name);
}});
先比较第二个比较器,然后再比较第一个比较器。我相信这样应该就可以了。你可以创建一个类来实现。
class FullName {
public String firstName;
public String secondName;
}
public static bool compareTo ( FullName name1, FullName name2 ) {
// Algorithm here
}
如果您使用静态比较器,您将需要执行以下操作:FullName.compareTo(BobBobbins, CharlieChaplin);