我有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中执行此操作的最有效方法是什么?
非常感谢!
答案 0 :(得分:8)
答案 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)运行时间