8

假设我有两个比较器,一个主要的和一个次要的。如何先按主要比较器对数组进行排序,然后按次要比较器?

假设每个对象都有一个名称和一个数字字段。

喜欢

Bob 1
Bob 2
Jack 1
Jack 2

是否可以不创建新的比较器?

4

3 回答 3

12

是的,您可以在不创建新比较器的情况下完成排序。

按主要字段、次要字段、第三字段等排序有一个众所周知的技巧:首先按最不重要的字段(第三字段)排序,然后是下一个重要字段(次要字段),最后是最重要的字段(主要字段)。但是排序算法需要稳定才能工作。

如果要对数组进行排序,请使用Arrays.sort(). 如果要对 a 进行排序List,请使用Collections.sort(). 这两种方法都保证是稳定的。

假设您的主要比较器对象存储在变量primaryComp中,而您的次要对象存储在secondaryComp. 然后这里是一些代码来完成你想要的:

Arrays.sort(mylist, secondaryComp);  // This must come first!
Arrays.sort(mylist, primaryComp);
于 2013-03-06T06:49:20.740 回答
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);
        }});
于 2013-03-06T06:43:52.683 回答
-1

先比较第二个比较器,再比较第一个比较器。我相信这应该可以解决问题。您可以创建一个类来执行此操作。

class FullName {
    public String firstName;
    public String secondName;
}

假设您创建了一个名为 的新名称,BobBobbins分配值,然后简单地先比较第二个名称,然后再比较第一个名称。您可以使用静态函数进行比较:

public static bool compareTo ( FullName name1, FullName name2 ) {
    // Algorithm here
}

如果您使用静态比较器,则必须这样做:FullName.compareTo( BobBobbins, CharlieChaplin );

于 2013-03-06T06:41:20.290 回答