汎用のCollection
があり、その中に含まれるアイテムをソートする方法を考えています。私はいくつかのことを試してみましたが、どれも機能しません。
コレクション自体には事前定義された順序がないため、Java.util.List
に変換する必要があります。次に、Java.util.Collections.sort
の1つの形式を使用できます
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
には順序付けがないため、ソートすることは意味がありません。 List
インスタンスと配列を並べ替えることができます。そのためのメソッドは Collections.sort()
と Arrays.sort()
です。
_Java.util.Collections
_によって提供される2つの基本オプションがあります。
<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
も確認できます。
コレクションオブジェクトがリストの場合、他の回答で提案されている並べ替え方法を使用します。
ただし、リストではなく、返されるCollectionオブジェクトのタイプをあまり気にしない場合は、ListではなくTreeSetを作成する方が速いと思います。
TreeSet sortedSet = new TreeSet(myComparator);
sortedSet.addAll(myCollectionToBeSorted);
Tがすべてである場合はできません。プロバイダーによって注入される必要があります。
Collection<T extends Comparable>
またはコンパレータを渡します
Collections.sort(...)
Lambda式を使用して、Person型のオブジェクトのリストがあると仮定すると、たとえば、次の操作を行うことにより、ユーザーの姓を並べ替えることができます。
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);
}
}
}
以下に例を示します。 (便宜上、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();
}
}
}
}
作業中の特定のコードがあり、問題が発生している場合は、擬似コードを投稿することができ、私たちはあなたを手助けすることができます!
同様の問題に出会いました。サードパーティのクラス(オブジェクト)のリストをソートする必要がありました。
List<ThirdPartyClass> tpc = getTpcList(...);
ThirdPartyClassは、Java比較可能なインターフェース。この問題へのアプローチ方法に関する mkyong からの優れた図を見つけました。ソートにはComparatorアプローチを使用する必要がありました。
//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;
}
}