ArrayList <Long>を降順にソートする方法は?


98

ArrayList<Long>Javaで降順で並べ替える方法は?

回答:


240

ここにあなたのための1つの方法がありますlist

list.sort(null);
Collections.reverse(list);

または、独自のものComparatorを実装して、逆のステップをソートして排除することもできます。

list.sort((o1, o2) -> o2.compareTo(o1));

または、単にCollections.reverseOrder()反転するだけなので、さらに単純に使用します。

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1このコードはばかげています。o1.compareTo(o2)次に使用します。
ilalex

4
@ilya:ええ、良い点ですが、o2.compareTo(o1)ここにある必要があります:)
WhiteFang34

2
list.sort(Collections.reverseOrder());
チュニック2017年

以下のための親指はlist.sort((o1, o2) -> o2.compareTo(o1))
arenaq


18

以下のコードを使用できます。

Collections.sort(list, Collections.reverseOrder());

または、カスタムコンパレータを使用する場合は、以下に示すように使用できます。

Collections.sort(list, Collections.reverseOrder(new CustomComparator());

ここで、CustomComparatorは、リストに存在するオブジェクトを比較するコンパレータクラスです。


10

Java 8

これをJava 8でうまくやることはとても楽しく簡単です

Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);

ラムダ式はここで揺れる!!!

abを比較するために複数のラインロジックが必要な場合は、次のように書くことができます

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});

1
これをb.compareTo(a)に変更すれば、コレクションを元に戻す必要はないと思います。
zawhtut 2015

@zawhtut、完全に本当です!ちょうど逆の()あなたはオプションを知っているので、選択はあなた次第です言及
azerafati

longをLongに変換する必要がありますか?
BluE 2018年


3

あなたの長い値がオブジェクトのどこかにあるラムダの場合、私が使用することをお勧めします:

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

またはさらに良い:

.sorted(Comparator.comparingLong(MyObject::getLong))


2

以下のように独自のコンパレータを実装するためのより一般的なアプローチ

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });


1

次のアプローチでは、リストを降順で並べ替え、 ' null '値も処理します。null値がある場合に備えて、Collections.sort()NullPointerExceptionをスローします

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });

0

ArrayListをのTreeSet代わりにでソートすることもできますcomparator。これは、整数配列について以前に私が持っていた質問の例です。「数字」をのプレースホルダー名として使用していArrayListます。


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}

ただし、TreeSet重複する値は保存されません。

0

だから、私が大切にしたいと思っていることを考えてみてください。ランタイムとメモリ。リストがあり、それを並べ替えたいとしましょう。できれば、組み込みの並べ替えがあるか、独自に並べ替えることができます。次に、リストを元に戻します。それが上記の答えです。

ただし、そのリストを作成している場合は、別のデータ構造を使用してリストを格納し、それを配列にダンプすることをお勧めします。

ヒープはまさにこれを行います。データをフィルターにかけると、すべてが処理され、オブジェクトからすべてをポップして並べ替えることができます。

別のオプションは、マップがどのように機能するかを理解することです。多くの場合、何かが呼ばれるMapまたはHashMapには、その背後にある基本的な概念があります。

たとえば...キーが長いKey-Valueペアの束をフィードし、すべての要素を追加すると、次のことができ .keysます。そうすると、自動的にソートされたリストに戻ります。

それはあなたがソートとその後の逆を続行する必要があると私が考える方法に関してデータをどのように処理するかに依存します


0

コンパレータの比較メソッドを使用してオブジェクトを比較し、メソッドreversed()を適用して順序を逆にすることができます-

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.