【问题标题】:sorting collections排序集合
【发布时间】:2011-09-12 16:01:35
【问题描述】:

我有一个 Persons 对象列表,其中包含两个属性名称和年龄。我想按年龄升序对这个列表进行排序,排序应该是所有名字相同的人都应该在列表的底部。

【问题讨论】:

  • 您的问题是什么?你试过什么?
  • 很难相信您在提出这个问题之前做了任何研究。
  • 我写了一个 PersonComparator 类,它实现了 Comparator 接口并覆盖了 compare()。以下是源代码:
  • public int compare(Person p1, Person p2) { int comparison = 0; switch(p) { case AGE_ASC: if(p1.getAge()== p2.getAge()) { // 我需要在这里做些什么吗? } else { 比较 = p1.getAge() - p2.getAge(); if(comparison!=0) 返回比较; } 休息; case AGE_DESC: 比较 = p2.getAge() - p1.getAge(); if(comparison!=0) 返回比较;休息; }
  • 我建议您先过滤掉重复项,然后将它们存储在单独的列表中。可能将它们从原始列表中删除。一旦你这样做了,按照下面的建议进行排序。要查找重复项,请参阅:stackoverflow.com/questions/6737212/…

标签: java sorting collections


【解决方案1】:

在您的Person 类中实现Compareable 接口(我并没有真正遵循您的逻辑,但我认为您可以将compareTo 方法更改为您需要的方法):

static class Person implements Comparable<Person> {
    final String name;
    final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person o) {
        if (o.age == age)
            return o.name.compareTo(name);
        return Integer.valueOf(age).compareTo(Integer.valueOf(o.age));
    }
}

public static void main(String[] args) throws Exception {

    List<Person> persons = new LinkedList<Person>();
    persons.add(new Person("David", 29));
    persons.add(new Person("Linnéa", 27));
    persons.add(new Person("Andreas", 28));
    persons.add(new Person("Christofer", 29));

    Collections.sort(persons);

    for (Person p : persons)
        System.out.println(p.name + " " + p.age);
}

输出:

Linnéa 27
Andreas 28
David 29
Christofer 29

【讨论】:

  • all the persons whose names are same should be at the bottom of the list
  • 没有任何意义.. 我希望 ritesh 不是那个意思 :)
  • 我的意思是同名的人不应该被排序,而是应该在所有按年龄排序的对象之后添加。
  • 我能够实现我想要的,但我认为这不是一个好主意。我首先使用我编写的比较器对列表进行了排序,然后运行嵌套的 for 循环以使用 Collections.swap() 交换具有相同名称的对象
【解决方案2】:

查看Collections.sort,以便根据其元素的自然顺序对列表进行排序。列表中的所有元素(即您的情况下的 Person 对象)应实现 Comparable 接口。

【讨论】:

    【解决方案3】:

    不要使用Comparable,而是使用ComparatorComparator 接口使您能够以任意数量的不同方式对给定集合进行排序。 Comparator 接口的另一个方便之处是您可以使用它对任何类的实例进行排序——甚至 您无法修改的类 — 与 Comparable 接口不同,它会强制您更改要对其实例进行排序的类。

    【讨论】:

    • 我使用了 Comparator,但在列表按年龄按 asc 顺序排序后,卡住了如何放置具有相同名称的对象。
    【解决方案4】:

    哦,我的蜘蛛感觉很刺痛,让我怀疑是家庭作业:) 我只会给你基本的想法。

    您可以使用常规比较器对列表进行排序,然后使用另一个循环根据名称对名称进行分组。 使用 lambdaJ 我会这样做:

    列出人员 = new LinkedList(){{ 添加(新人(“大卫”,29)); 添加(新人(“林内亚”,21)); 添加(新人(“林内亚”,27)); 添加(新人(“林内亚”,29)); 添加(新人(“安德烈亚斯”,28)); 添加(新人(“克里斯托弗”,29)); }}; 列表排序 = sort(persons, on(Person.class).getAge()); Group groups = group(sorted, by(on(Person.class).getName())); for(Person 人:groups.findAll()){ System.out.println(person); }

    输出:

    林内:21 林内:27 林内:29 安德烈亚斯:28 大卫:29 克里斯托弗:29

    【讨论】:

    • 谢谢你能提供更多细节吗:)
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 2018-01-02
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多