如何对Collection <T>进行sorting?

我有一个通用的Collection并试图找出如何对其中包含的项目进行sorting。 我已经尝试了一些东西,但我不能让他们中的任何一个工作。

集合本身并不具有预定义的顺序,因此您必须将它们转换为java.util.List 。 那么你可以使用java.util.Collections.sort一种forms

 Collection< T > collection = ...; List< T > list = new ArrayList< T >( collection ); Collections.sort( list ); // or Collections.sort( list, new Comparator< T >( ){...} ); // list now is sorted 

一个Collection没有sorting,所以想sorting它是没有意义的。 您可以对List实例和数组进行sorting,并且可以对Collections.sort()Arrays.sort()

如果你的集合对象是一个列表,我会使用其他答案中提出的sorting方法。

但是,如果它不是一个列表,并且不关心返回什么types的Collection对象,我认为创build一个TreeSet而不是一个List会更快:

 TreeSet sortedSet = new TreeSet(myComparator); sortedSet.addAll(myCollectionToBeSorted); 

java.util.Collections提供了两个基本选项:

  • <T extends Comparable<? super T>> void sort(List<T> list)
    • 如果T implements Comparable ,那么使用这个就可以了
  • <T> void sort(List<T> list, Comparator<? super T> c)
    • 如果你想提供你自己的Comparator使用这个。

取决于Collection内容,还可以查看SortedSetSortedMap

如果T是你所能得到的,你就不能。 你必须通过提供者注入它:

 Collection<T extends Comparable> 

或通过Collections.sort(…)方法传入比较器

这是一个例子。 (为了方便起见,我使用了Apache的CompareToBuilder类,尽pipe这可以在不使用它的情况下完成)。

 import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.commons.lang.builder.CompareToBuilder; public class Tester { boolean ascending = true; public static void main(String args[]) { Tester tester = new Tester(); tester.printValues(); } public void printValues() { List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> map = new HashMap<String, Object>(); map.put( "actionId", new Integer(1234) ); map.put( "eventId", new Integer(21) ); map.put( "fromDate", getDate(1) ); map.put( "toDate", getDate(7) ); list.add(map); map = new HashMap<String, Object>(); map.put( "actionId", new Integer(456) ); map.put( "eventId", new Integer(11) ); map.put( "fromDate", getDate(1) ); map.put( "toDate", getDate(1) ); list.add(map); map = new HashMap<String, Object>(); map.put( "actionId", new Integer(1234) ); map.put( "eventId", new Integer(20) ); map.put( "fromDate", getDate(4) ); map.put( "toDate", getDate(16) ); list.add(map); map = new HashMap<String, Object>(); map.put( "actionId", new Integer(1234) ); map.put( "eventId", new Integer(22) ); map.put( "fromDate", getDate(8) ); map.put( "toDate", getDate(11) ); list.add(map); map = new HashMap<String, Object>(); map.put( "actionId", new Integer(1234) ); map.put( "eventId", new Integer(11) ); map.put( "fromDate", getDate(1) ); map.put( "toDate", getDate(10) ); list.add(map); map = new HashMap<String, Object>(); map.put( "actionId", new Integer(1234) ); map.put( "eventId", new Integer(11) ); map.put( "fromDate", getDate(4) ); map.put( "toDate", getDate(15) ); list.add(map); map = new HashMap<String, Object>(); map.put( "actionId", new Integer(567) ); map.put( "eventId", new Integer(12) ); map.put( "fromDate", getDate(-1) ); map.put( "toDate", getDate(1) ); list.add(map); System.out.println("\n Before Sorting \n "); for( int j = 0; j < list.size(); j++ ) System.out.println(list.get(j)); Collections.sort( list, new HashMapComparator2() ); System.out.println("\n After Sorting \n "); for( int j = 0; j < list.size(); j++ ) System.out.println(list.get(j)); } public static Date getDate(int days) { Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); cal.add(Calendar.DATE, days); return cal.getTime(); } public class HashMapComparator2 implements Comparator { public int compare(Object object1, Object object2) { if( ascending ) { return new CompareToBuilder() .append( ((HashMap)object1).get("actionId"), ((HashMap)object2).get("actionId") ) .append( ((HashMap)object2).get("eventId"), ((HashMap)object1).get("eventId") ) .toComparison(); } else { return new CompareToBuilder() .append( ((HashMap)object2).get("actionId"), ((HashMap)object1).get("actionId") ) .append( ((HashMap)object2).get("eventId"), ((HashMap)object1).get("eventId") ) .toComparison(); } } } } 

如果你有一个特定的代码,你正在工作,有问题,你可以发布你的伪代码,我们可以尝试帮助你!

假设您有一个Persontypes的对象列表,使用Lambdaexpression式,您可以通过执行以下操作对用户的姓氏进行sorting:

 import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; class Person { private String firstName; private String lastName; public Person(String firstName, String lastName){ this.firstName = firstName; this.lastName = lastName; } public String getLastName(){ return this.lastName; } public String getFirstName(){ return this.firstName; } @Override public String toString(){ return "Person: "+ this.getFirstName() + " " + this.getLastName(); } } class TestSort { public static void main(String[] args){ List<Person> people = Arrays.asList( new Person("John", "Max"), new Person("Coolio", "Doe"), new Person("Judith", "Dan") ); //Making use of lambda expression to sort the collection people.sort((p1, p2)->p1.getLastName().compareTo(p2.getLastName())); //Print sorted printPeople(people); } public static void printPeople(List<Person> people){ for(Person p : people){ System.out.println(p); } } }