web-dev-qa-db-ja.com

Javaコレクションの並べ替え

Javaコレクションがあります:

Collection<CustomObject> list = new ArrayList<CustomObject>();

表示リストの前にCustomObjectにはidフィールドがあります。このコレクションをidでソートしたいのです。

それを行う方法はありますか?

73
Makky

コンパレータ を使用します:

List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
    @Override
    public int compare(CustomObject left, CustomObject right) {
        return left.getId() - right.getId(); // use your logic
    }
};

Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);

さらに、CustomObjectimplements Comparableの場合は、Collections.sort(list)を使用します

JDK 8では、構文がはるかに簡単になりました。

List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);

はるかに単純な

List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);

最も単純な

List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);

明らかに、初期コードはJDK 8にも使用できます。

150
Kowser

問題は、「コレクションの並べ替え」です。したがって、Collections.sort(List<T> l, Comparator<? super T> comparator)は使用できません。

いくつかのヒント:

コレクションタイプの場合:

Comparator<String> defaultComparator = new Comparator<String>() {
   @Override
   public int compare(String o1, String o2) {
       return o1.compareTo(o2);
   }
};

Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);

Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish

リストタイプの場合:

List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);

セットタイプの場合:

Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use Java.util.TreeSet
// TreeSet sample:
// Sorted using Java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);

Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);

Java 8バージョン。Java.util.List#sort(Comparator<? super E> c)メソッドがあります

List<String> list = getSomeStringList();
list.sort(defaultComparator);

または

List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));

またはComparableを実装する型の場合:

List<String> list = getSomeStringList();
list.sort(String::compareTo);
28
Aliaksei Yatsau

Comparableを実装していないクラスがあり、それでもフィールドまたはメソッドでソートしたい場合、少し異なる例があります。

Collections.sort(allMatching, new Comparator<ClassOne>() {
  @Override public int compare(final ClassOne o1, final ClassOne o2) {
    if (o1.getMethodToSort() > o2.getMethodToSort()) {
      return 1;
    } else if (o1.getMethodToSort() < o2.getMethodToSort()) {
      return -1;
    }  
    return 0;
  }
});
11
Shawn Vader

Comparatorインターフェイスを実装する必要があります。

例:

public class CustomComparator implements Comparator<CustomObject> 
{
    @Override
    public int compare(CustomObject o1, CustomObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
}

その後、コレクションクラスCollections.sort()メソッドを使用できます。

Collections.sort(list, new CustomComparator());
6
Hunter McMillen

CustomObjectに Comparable インターフェイスを実装します。

5
DwB

Java 8の時点で、ラムダを使用してストリームでそれを行うことができます。

list.stream().sorted(Comparator.comparing(customObject::getId))
             .foreach(object -> System.out.println(object));
4
SebastianM.

Comparator が道

も参照してください

4
Jigar Joshi

正解はたくさんありますが、私はこれを見つけていません。コレクションをソートすることはできません。コレクションを反復処理することしかできません。

これで、それらを繰り返して、新しいソート済みsomethingを作成できます。そのための回答はこちらをご覧ください。

4
estani

sort を使用します。

あなたはこれをする必要があります:

リスト内のすべての要素は、Comparableインターフェイスを実装する必要があります。

(または、他の人がすでに言ったように、その下のバージョンを使用します。)

2
zw324

Java 8には、メソッド参照と組み込みのcomparingコンパレーターを組み合わせたいくつかのオプションがあります。

import static Java.util.Comparator.comparing;

Collection<CustomObject> list = new ArrayList<CustomObject>();

Collections.sort(list, comparing(CustomObject::getId));
//or
list.sort(comparing(CustomObject::getId));
0
assylias

SortedSet およびコンパレータ。コンパレータはidフィールドを尊重する必要があります。

0

ソートの目的でJavaカスタムクラスを使用できます。

0
user7225794