web-dev-qa-db-ja.com

Collection <T>を並べ替える方法は?

汎用のCollectionがあり、その中に含まれるアイテムをソートする方法を考えています。私はいくつかのことを試してみましたが、どれも機能しません。

51
Mercer

コレクション自体には事前定義された順序がないため、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
68

Collectionには順序付けがないため、ソートすることは意味がありません。 Listインスタンスと配列を並べ替えることができます。そのためのメソッドは Collections.sort()Arrays.sort() です。

9

_Java.util.Collections_によって提供される2つの基本オプションがあります。

Collectionが何であるかに応じて、SortedSetまたはSortedMapも確認できます。

6

コレクションオブジェクトがリストの場合、他の回答で提案されている並べ替え方法を使用します。

ただし、リストではなく、返されるCollectionオブジェクトのタイプをあまり気にしない場合は、ListではなくTreeSetを作成する方が速いと思います。

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

Tがすべてである場合はできません。プロバイダーによって注入される必要があります。

Collection<T extends Comparable>

またはコンパレータを渡します

Collections.sort(...)
5
andyczerwonka

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);
            }
        }
    }
1
lomse

以下に例を示します。 (便宜上、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();
            }
        }
    }
}

作業中の特定のコードがあり、問題が発生している場合は、擬似コードを投稿することができ、私たちはあなたを手助けすることができます!

1
jagamot

同様の問題に出会いました。サードパーティのクラス(オブジェクト)のリストをソートする必要がありました。

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;
}
}
0
spaniard81