如何对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
内容,还可以查看SortedSet
或SortedMap
。
如果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); } } }