web-dev-qa-db-ja.com

Java配列ソートの降順

Arraysクラスで昇順でソートする方法のように、配列を降順でソートする簡単な方法はありますか?

それとも怠惰になるのをやめて、これを自分でやらなければなりませんか。

246
AFK

これを使ってあらゆる種類のオブジェクトをソートすることができます

sort(T[] a, Comparator<? super T> c) 

Arrays.sort(a, Collections.reverseOrder());

Arrays.sort()を直接使用してプリミティブ配列を降順にソートすることはできません。 Arrays.sort()で定義されたリバースコンパレータを渡してCollection.reverseOrder()メソッドを呼び出そうとすると、エラーが発生します。

sortに適したメソッドが見つかりません(int []、コンパレータ)

Integer配列ではうまくいきますが、int配列ではうまくいきません。

プリミティブ配列を降順に並べ替える唯一の方法は、まず配列を昇順に並べ替えてから、配列を元に戻すことです。これは、2次元プリミティブ配列にも当てはまります。

291
user173973

これを使うことができます:

    Arrays.sort(data, Collections.reverseOrder());

Collections.reverseOrder()は、逆の自然順を使ってComparatorを返します。 Collections.reverseOrder(myComparator)を使ってあなた自身のコンパレータの反転バージョンを得ることができます。

90
William

リスト用

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

配列の場合

Arrays.sort(array, Collections.reverseOrder());
88
Ornithopter

別の方法があります(数字の場合は!!!)

  1. 配列に-1を掛けます
  2. ソート
  3. もう一度-1を掛けます

文字通り話されている:

array = -Arrays.sort(-array)
49
FHDougherty

明示的な比較なし

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

明示的な比較子を使う:

Collections.sort(list, Collections.reverseOrder(new Comparator()));
46
Milan

Java 8:

Arrays.sort(list, comparator.reversed());

更新:reversed()は指定されたコンパレータを反転します。通常、比較子は昇順に並ぶので、これは降順に並び替えます。

7
Michel Jung

私はあなたのユースケースが何であったかわかりません、しかしここで他の答えに加えてもう一つの(怠惰な)オプションはあなたが示すようにまだ昇順にソートすることですそしてそれから逆に繰り返すこと代わりに注文してください。

4
SK9

まず、配列を並べ替える必要があります。

Collections.sort(Myarray);

それからあなたは昇順から降順に順番を逆にする必要があります:

Collections.reverse(Myarray);
4
Masoud

org.Apache.commons.lang(3)が処分されている場合にプリミティブの要素を含む配列の場合(配列をソートした後で)配列を逆にする簡単な方法は以下を使うことです。

ArrayUtils.reverse(array);
4
Josip Maslac

別の解決策は、Comparableインターフェイスを使用している場合、指定した出力値を切り替えることができるということです。 compareTo(Object bCompared)。

例えば ​​:

public int compareTo(freq arg0) 
{
    int ret=0;
    if(this.magnitude>arg0.magnitude)
        ret= 1;
    else if (this.magnitude==arg0.magnitude)
        ret= 0;
    else if (this.magnitude<arg0.magnitude)
        ret= -1;
    return ret;
}

ここで、magnitudeは、私のプログラムではdoubleデータ型の属性です。これは、定義したクラスfreqを大きさで逆順に並べ替えていました。したがって、それを修正するには、<>によって返される値を切り替えます。これにより、次のことができます。

public int compareTo(freq arg0) 
{
    int ret=0;
    if(this.magnitude>arg0.magnitude)
        ret= -1;
    else if (this.magnitude==arg0.magnitude)
        ret= 0;
    else if (this.magnitude<arg0.magnitude)
        ret= 1;
    return ret;
}

このcompareToを利用するには、Arrays.sort(mFreq)を呼び出すだけで、ソートされた配列freq [] mFreqが提供されます。

(私の意見では)このソリューションの美しさは、ユーザー定義のクラスをソートするために使用できることです。さらに、特定の属性でクラスをソートすることもできます。 Comparableインターフェースの実装が気に障る場合は、そのように考えないことをお勧めしますが、実際はそうではありません。この 同等の実装方法に関するリンク により、作業がずっと簡単になりました。人がこの解決策を利用できることを望み、あなたの喜びが比較可能になることさえあります。

3
Chris - Jr
array.sort(function(a, b) {return b - a;}); //descending 

または

array.sort(function(a, b) {return a - b;}); //ascending
2
AzFalconer
public double[] sortArrayAlgorithm(double[] array) { //sort in descending order
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array.length; j++) {
            if (array[i] >= array[j]) {
                double x = array[i];
                array[i] = array[j];
                array[j] = x;
            }
        }
    }
    return array;
}

このメソッドを使用してdouble型の配列を降順にソートするだけです。「戻り型」、「引数型」、および対応する型に対する変数 "x"型。 if条件で "> ="を "<="に変更して、順序を昇順にすることもできます。

0
Mohsen

あなたは stream オペレーション( Collections.stream() )を Comparator.reverseOrder()

たとえば、このコレクションがあるとします。

List<String> items = new ArrayList<>();
items.add("item01");
items.add("item02");
items.add("item03");
items.add("item04");
items.add("item04");

項目を「自然な」順序で印刷するには、 sorted() メソッドを使用します(または省略しても同じ結果になります)。

items.stream()
     .sorted()
     .forEach(item -> System.out.println(item));

あるいは、降順(逆順)に印刷するには、Comparatorを使用して順序を逆にする sorted メソッドを使用できます。

items.stream()
     .sorted(Comparator.reverseOrder())
     .forEach(item -> System.out.println(item));

これにはコレクションがComparableを実装している必要があることに注意してください(Integer、Stringなど)。

0
J Woodchuck

これは私のために働いた:

package doublearraysort;

import Java.util.Arrays;
import Java.util.Collections;

public class Gpa {


    public static void main(String[] args) {
        // initializing unsorted double array
        Double[] dArr = new Double[] {                 
            new Double(3.2),
            new Double(1.2),
            new Double(4.7),
            new Double(3.3),
            new Double(4.6),
           };
        // print all the elements available in list
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }

        // sorting the array
        Arrays.sort(dArr, Collections.reverseOrder());

        // print all the elements available in list again
        System.out.println("The sorted GPA Scores are:");
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }
    }
}

出力:

GPA = 3.2
GPA = 1.2
GPA = 4.7
GPA = 3.3
GPA = 4.6
The sorted GPA Scores are:
GPA = 4.7
GPA = 4.6
GPA = 3.3
GPA = 3.2
GPA = 1.2
0
Fred Denson

私はこれがかなり古いスレッドであることを知っています、しかしここにIntegersとJava 8のための更新版があります:

Arrays.sort(array, (o1, o2) -> o2 - o1);

通常の昇順(またはComparator.comparingInt())の場合は「o1 - o2」です。

これは他の種類のオブジェクトに対しても機能します。いう:

Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue());
0
sebschaef

Arrays.sort()およびCollections.reverseOrder()を使用してプリミティブの配列(つまり、int[] arr = {1, 2, 3};)を逆ソートすることは直接可能ではありません。これらのメソッドは、プリミティブ型(Integer)ではなく参照型(int)を必要とするためです。

ただし、Java 8 Streamを使用して、配列を最初にボックス化して逆順で並べ替えることができます。

// an array of ints
int[] arr = {1, 2, 3, 4, 5, 6};

// an array of reverse sorted ints
int[] arrDesc = Arrays.stream(arr).boxed()
    .sorted(Collections.reverseOrder())
    .mapToInt(Integer::intValue)
    .toArray();

System.out.println(Arrays.toString(arrDesc)); // outputs [6, 5, 4, 3, 2, 1]
0
kimbaudi