【问题标题】:Collections sort Java集合排序 Java
【发布时间】:2018-01-02 08:17:53
【问题描述】:

大家好,我有 3 个系列, 第一个我想按姓名排序,第二个用于电子邮件,最后一个我想按年龄排序。 我的问题是它可以使用集合吗?

如果我在 sql 中这样做

sort by name,email,age

我知道它工作正常吗?

我正在尝试像这样在 java 中这样做。

Collections.sort(listPeople, new Comparator<People>() {
    @Override
    public int compare(final People o1, final People o2) {
        return o1.getName().compareTo(o2.getName());
    }
});

//then

Collections.sort(listPeople, new Comparator<People>() {
    @Override
    public int compare(final People o1, final People o2) {
        return o1.getEmail().compareTo(o2.getEmail());
    }
});

//and then 

Collections.sort(listPeople, new Comparator<People>() {
    @Override
    public int compare(final People o1, final People o2) {
        return o1.getAge().compareTo(o2.getAge());
    }
});

有用吗?还是每个集合都覆盖以前的?

【问题讨论】:

  • 你为什么不尝试运行它并告诉我们它是否有效
  • 类应该以单个实例命名。如果您的类的实例代表一个人,请将其命名为 Person,而不是 People
  • 你的问题有点自相矛盾。 SQL sort by name,email,age(真的,order by)对多个字段上的一组行进行排序。但是然后您谈论 3 个集合,每个集合在一个字段上排序。然后您的代码对一个集合进行 3 次排序。请澄清。
  • 这只是一个例子:P
  • @Arkadiy 想要的是你的问题更准确。你到底想达到什么目的?您是否想通过不同的比较器对 3 个不同的集合进行排序,或者您想使用按名称排序的比较器对一个集合进行排序,但如果名称相等则按电子邮件排序,如果电子邮件相等则按年龄排序。目前状态还不清楚。

标签: java sorting collections java-8


【解决方案1】:

如果您连续对同一个集合进行排序,那么这些操作将覆盖其他排序操作的效果。


您可以通过调整自定义比较器来实现您想要的。首先比较name,如果元素相等则比较email,如果相等则比较age

看看这段代码sn-p:

Collections.sort(listPeople, new Comparator<People>() {
    @Override
    public int compare(final People o1, final People o2) {
        int nameOrder = o1.getName().compareTo(o2.getName());
        if (nameOrder != 0) {
            return nameOrder;
        }

        // Elements names are equal, compare by their email
        int emailOrder = o1.getEmail().compareTo(o2.getEmail());
        if (emailOrder != 0) {
            return emailOrder ;
        }

        // Elements emails are equal, compare by their age
        int ageOrder = o1.getAge().compareTo(o2.getAge());
        // Return that in any case as we do not have another sorting criteria
        return ageOrder;
    }
});

Java 8 开始,您可以用更少的代码实现相同的目标(参见 @Eugene 的回答):

Comparator.comparing(People::getName)
    .thenComparing(People::getEmail)
    .thenComparing(People::getAge));

这将创建与上述相同的比较器。

【讨论】:

    【解决方案2】:

    如果我猜对了,你应该在这里使用 java-8 功能...

    Collections.sort(listPeople, Comparator.comparing(People::getName)
                         .thenComparing(People::getEmail)
                         .thenComparing(People::getAge));
    

    【讨论】:

    • 虽然这段代码确实解决了 OP 的问题,但它并没有解释它是如何工作的。对我来说,这听起来像是 OP 在一些基础知识方面遇到了困难,可能解释有助于更多地了解事情是如何工作的,因为只是发布一些可以解决问题的魔术代码。
    • @Zabuza ...这就是您的回答确实如此。特别是因为它被标记为java-8 而我确实 assume 用户能够阅读这个“魔法代码”。嘿,顺便说一句,我给你的答案加了一个,所以谢谢你填补他的空白;)
    • 哦,没看到java-8标签,那我肯定撤回我的反对:)
    • listPeople.sort(...)
    • @holi-java thx 为我标记了这个问题 - 我真的很喜欢它。但我没有答案......我想你将不得不等待其他人。对不起
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2011-10-20
    • 2015-07-21
    相关资源
    最近更新 更多