首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给出了两个比较器的排序数组?

问给出了两个比较器的排序数组?
EN

Stack Overflow用户
提问于 2013-03-06 14:26:22
回答 3查看 4.2K关注 0票数 8

假设我有两个比较器,一个是主要的,一个是次要的。如何先按主比较器排序数组,再按次比较器排序?

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

喜欢

代码语言:javascript
复制
Bob 1
Bob 2
Jack 1
Jack 2

有没有可能不创建一个新的比较器?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-06 14:49:21

是的,您无需创建新的比较器即可完成排序。

有一个用于按主要字段、次要字段、第三字段等排序的well-known trick:首先按最不重要的字段(第三字段)排序,然后按下一个重要字段(次要字段)排序,最后按最重要字段(主要字段)排序。但排序算法需要稳定才能正常工作。

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

假设您的主要比较器对象存储在变量primaryComp中,次要比较器对象存储在secondaryComp中。下面是一些代码来实现您想要的功能:

代码语言:javascript
复制
Arrays.sort(mylist, secondaryComp);  // This must come first!
Arrays.sort(mylist, primaryComp);
票数 12
EN

Stack Overflow用户

发布于 2013-03-06 14:43:53

假设您的类是

代码语言:javascript
复制
class X {
    String name;
    int num;
}

则排序将是

代码语言:javascript
复制
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);
        }});
票数 7
EN

Stack Overflow用户

发布于 2013-03-06 14:41:20

首先比较第二个比较器,然后比较第一个比较器。我相信这应该能起到作用。您可以创建一个类来执行此操作。

代码语言:javascript
复制
class FullName {
    public String firstName;
    public String secondName;
}

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

代码语言:javascript
复制
public static bool compareTo ( FullName name1, FullName name2 ) {
    // Algorithm here
}

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15240447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档