我有一个通用的Collection
,我正试图找出如何对其中包含的项进行排序。我尝试过一些东西,但我不能让它们中的任何一个起作用。
答案 0 :(得分:67)
集合本身没有预定义的顺序,因此您必须将它们转换为
一个java.util.List
。然后,您可以使用java.util.Collections.sort
Collection< T > collection = ...;
List< T > list = new ArrayList< T >( collection );
Collections.sort( list );
// or
Collections.sort( list, new Comparator< T >( ){...} );
// list now is sorted
答案 1 :(得分:9)
Collection
没有排序,所以想要对它进行排序没有意义。您可以对List
个实例和数组进行排序,执行该操作的方法是Collections.sort()
和Arrays.sort()
答案 2 :(得分:6)
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
。
答案 3 :(得分:6)
如果您的集合对象是一个列表,我将使用排序方法,如其他答案中所建议的那样。
但是,如果它不是列表,并且您并不真正关心返回什么类型的Collection对象,我认为创建TreeSet而不是List更快:
TreeSet sortedSet = new TreeSet(myComparator);
sortedSet.addAll(myCollectionToBeSorted);
答案 4 :(得分:5)
如果你得到T,你就不能。它必须由提供者注入:
Collection<T extends Comparable>
或传递比较器
Collections.sort(...)
答案 5 :(得分:1)
这是一个例子。 (为方便起见,我使用Apache的CompareToBuilder
类,尽管可以在不使用它的情况下完成。)
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();
}
}
}
}
如果您有正在使用的特定代码并且遇到问题,可以发布您的伪代码,我们可以尝试帮助您!
答案 6 :(得分:1)
假设您有一个Person类型的对象列表,使用Lambda表达式,您可以通过执行以下操作来对用户的姓氏进行排序:
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);
}
}
}
答案 7 :(得分:0)
我遇到了类似的问题。必须对第三方类别(对象)的列表进行排序。
List<ThirdPartyClass> tpc = getTpcList(...);
ThirdPartyClass没有实现Java Comparable接口。我从mkyong中找到了一个很好的例证,说明了如何解决此问题。我必须使用比较器方法进行排序。
//Sort ThirdPartyClass based on the value of some attribute/function
Collections.sort(tpc, Compare3rdPartyObjects.tpcComp);
比较器所在的位置:
public abstract class Compare3rdPartyObjects {
public static Comparator<ThirdPartyClass> tpcComp = new Comparator<ThirdPartyClass>() {
public int compare(ThirdPartyClass tpc1, ThirdPartyClass tpc2) {
Integer tpc1Offset = compareUsing(tpc1);
Integer tpc2Offset = compareUsing(tpc2);
//ascending order
return tpc1Offset.compareTo(tpc2Offset);
}
};
//Fetch the attribute value that you would like to use to compare the ThirdPartyClass instances
public static Integer compareUsing(ThirdPartyClass tpc) {
Integer value = tpc.getValueUsingSomeFunction();
return value;
}
}