0

我有 2 个数组列表。一个是包含生日的数组列表。另一个是名称的数组列表。

我正在使用按日期降序对日期数组列表进行排序

Collections.sort(birthdayList);

我想让名称的数组列表按照与生日列表相同的顺序进行排序。

IE

未分类

bdaylist   namelist

1/20/1980 - Bob

3/15/1970 - Todd

8/25/1990 - Jeff

变成

排序的

3/15/1970 - Todd

1/20/1980 - Bob

8/25/1990 - Jeff

在 Java 中执行此操作的最有效方法是什么?

非常感谢!

4

4 回答 4

8
  • 创建一个包含 2 个字段的 Person 类:姓名和生日。
  • 将人员列在列表中
  • 使用比较生日的自定义比较器进行排序
于 2012-10-22T15:46:51.847 回答
4

像这样创建一个类:

public class Person implements Comparable<Person> {

    private String name;

    private Date date;

    public Person(String name, Date date) {
        this.name = name;
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public Date getDate() {
        return date;
    }

    @Override
    public int compareTo(Person o) {
        return this.date.compareTo(o.getDate());
    }
}

然后你可以Person像这样对对象列表进行排序:

public static void main(String... args) {
    LinkedList<Person> persons = new LinkedList<Person>();
    persons.add(new Person("Name1", new Date())); //Specify different dates
    persons.add(new Person("Name2", new Date()));
    persons.add(new Person("Name3", new Date()));

    Collections.sort(persons);

    //Collections.sort(persons, Collections.reverseOrder()); //Reverse order
}

而已。

或者另一种选择是使用Comparator

Collections.sort(persons, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getDate().compareTo(o2.getDate());
    }
});

相反的顺序:

Collections.sort(persons, Collections.reverseOrder(new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getDate().compareTo(o2.getDate());
    }
}));

然后你不需要Comparable<Person>在你的 person 类中实现。

于 2012-10-22T15:52:28.413 回答
3

不要对两个数组列表进行排序;对一个包含日期和名称的组合对象进行排序的数组列表。这真的是唯一的办法。

于 2012-10-22T15:46:16.637 回答
0

关于实现Comparable和使用它作为比较器的其他答案确实都是正确的。但是,如果这也有帮助...

根据Collections.sort 的 Javadoc,请注意 sort() 使用Modified Mergesort作为排序算法。如果我错了,请纠正我,但人们普遍认为,在所有排序算法中,合并排序在最坏情况下实现了最佳运行时间:O(n log n)(我并没有消除这样一个事实可能还有其他排序算法在最坏的情况下也能达到 O(n log n))。

但是,O(n log n) 只是无界值域的最佳运行时间。如果您的域有界限,那么您可以使用桶排序获得更好的 O(n) 运行时间。

于 2012-10-22T16:01:31.163 回答