使用两种比较器排序数组?

9

假设我有两个比较器,一个是主比较器,另一个是次要比较器。如何通过主比较器和次要比较器对数组进行排序?

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

例如:

Bob 1
Bob 2
Jack 1
Jack 2

不创建新的比较器,是否可能实现?

3个回答

14

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

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

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

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

Arrays.sort(mylist, secondaryComp);  // This must come first!
Arrays.sort(mylist, primaryComp);

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);
        }});

-1

先比较第二个比较器,然后再比较第一个比较器。我相信这样应该就可以了。你可以创建一个类来实现。

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

假设你创建了一个新的名字,叫做"BobBobbins",给它赋值然后先比较第二个名字,再比较第一个名字。你可以定义一个静态函数来进行比较:
public static bool compareTo ( FullName name1, FullName name2 ) {
    // Algorithm here
}

如果您使用静态比较器,您将需要执行以下操作:FullName.compareTo(BobBobbins, CharlieChaplin);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接