排序2个数组列表的最佳方法?

时间:2012-10-22 15:45:07

标签: java

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

我使用

按日期降序排序日期数组列表
Collections.sort(birthdayList);

我想让名字的数组列表按生日列表的顺序排序。

未排序

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 个答案:

答案 0 :(得分:8)

  • 创建一个包含2个字段的Person类:name和birthday。
  • 将这些人列入名单
  • 使用比较生日的自定义比较器进行排序

答案 1 :(得分: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>

答案 2 :(得分:3)

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

答案 3 :(得分:0)

关于实施Comparable并将其用作比较器的其他答案都是正确的。但是,如果这也有帮助......

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

但是,O(n log n)只是无界域值的最佳运行时间。如果您的域名受到限制,那么您可以使用 Bucket Sort.

获得更好的O(n)运行时间