2012-10-22 31 views
0

我有2个数组列表。一个是包含生日的数组列表。另一个是名称的数组列表。排序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

有对象实现可比''和提供自己的'compareTo'实施 – mre

+0

[这](一个O(n)的更好的运行时间http://stackoverflow.com/questions/12817616/sort-a-list-based-on-a-parameter-available-in-another-class/12817959#12817959)答案可以使用。 – ReyCharles

回答

3

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

8
  • 创建一个Person类,其中包含两个字段:姓名和生日。
  • 把人的名单
  • 排序与比较的生日
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>

0

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

根据Javadoc for Collections.sort,请注意sort()使用修改的Mergesort作为排序算法。纠正我,如果我错了,但它被广泛接受的是,合并排序实现最差情况下的所有排序算法的可能运行时间:O(n日志n)(我没有消除事实上可能有其他排序算法在最坏的情况下也能达到O(n log n))。

但是,O(n log n)只是最大可能运行时间的一个无界值域。如果你有一个绑定在你的域名,那么你可以得到使用Bucket Sort.

相关问题