假设我有两个比较器,主要和次要。如何首先通过主比较器对数组进行排序,然后通过辅助?
对数组进行排序假设每个对象都有一个名称和一个数字字段。
像
Bob 1
Bob 2
Jack 1
Jack 2
是否可以不创建新的比较器?
答案 0 :(得分:10)
是的,您可以在不创建新比较器的情况下完成排序。
主要字段(二级,三级等)排序有well-known trick:首先按最不重要的字段(第三级)排序,然后是下一个重要字段(次要),最后是最重要的字段(主)。但是排序算法需要稳定才能实现。
如果要对数组进行排序,请使用Arrays.sort()
。如果您要对List
进行排序,请使用Collections.sort()
。这两种方法都保证稳定。
假设您的主比较对象存储在变量primaryComp
中,而您的辅助对象存储在secondaryComp
中。然后这里有一些代码可以实现你想要的:
Arrays.sort(mylist, secondaryComp); // This must come first!
Arrays.sort(mylist, primaryComp);
答案 1 :(得分:7)
假设你的班级是
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);
}});
答案 2 :(得分:-1)
首先比较第二个比较器,然后比较第一个比较器。我相信应该这样做。您可以创建一个类来执行此操作。
class FullName {
public String firstName;
public String secondName;
}
假设您创建一个名为BobBobbins
的新名称,分配值,然后先简单地比较第二个名称,然后再比较第一个名称。您可以使用静态函数进行比较:
public static bool compareTo ( FullName name1, FullName name2 ) {
// Algorithm here
}
如果您使用静态比较器,则必须执行此操作:FullName.compareTo( BobBobbins, CharlieChaplin );