Java配列の降順ソート?


回答:


330

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

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

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

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

sort(int []、comparator)に適したメソッドが見つかりません

これは、整数配列などの「オブジェクトの配列」では正常に機能しますが、int配列などのプリミティブ配列では機能しません。

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


115
プリミティブの配列をソートすることはできません
Masood_mj '31 / 07/31

14
プリミティブをそれぞれのオブジェクトに変換します。intの場合は整数、doubleの場合はDouble、ブール値の場合はBooleanなど
Ishmael 2013

12
カスタムコンパレータを引き続き使用する場合:Collections.reverseOrder(this)
Sebastian Hojas 2013年

Collections.reverseOrder()はパラメーターを取りません(何か不足している場合を除きます)。代わりにmyComparator.reversed()を使用しました。
jsaven 2017

1
Arrays.sort()を直接使用して、プリミティブ配列を降順でソートすることはできません。Collection.reverseOrder()で定義された逆コンパレータを渡してArrays.sort()メソッドを呼び出そうとすると、「sort(int []、comparator <object>)に適切なメソッドが見つかりません」というエラーがスローされます。 Integer配列では正常に機能しますが、int配列では機能しません。プリミティブ配列を降順で並べ替える唯一の方法は、最初に配列を昇順で並べ替えてから、配列を逆に配置することです。これは、2次元のプリミティブ配列にも当てはまります。
アクリアコ2018年

96

リスト用

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

アレイ用

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

25
int [] array = {2,4,3,6,8,7}; Arrays.sort(array、Collections.reverseOrder()); エラーが出ます!エラーは次のとおりです。「タイプArraysのメソッドsort(int [])は引数(int []、Comparator <Object>)には適用できません」
Dixit Singla

8
intはオブジェクトではありません。代わりにInteger []を使用してください。
Ornithopter 2014年

6
intはプライマリ型ですが、Integerはそうではありません。これが、Integerにparse、toStringなどのメソッドがある理由です
Ornithopter

91

あなたはこれを使うことができます:

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

Collections.reverseOrder()Comparator自然順序の逆を使用してを返します。を使用して、独自のコンパレータの反転バージョンを取得できますCollections.reverseOrder(myComparator)


8
OPは配列をソートする必要があります。Collections.sort()は、List配列ではなく入力パラメーターとして使用します。
Pascal Thivent 2009年

61

代替は可能性があります(数値の場合!!!)

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

文字通り話される:

array = -Arrays.sort(-array)

7
我々は...それは一般的なものではなく、オーバーフローの問題を引き起こす可能性があるにもかかわらず、数字をソートしている場合、このメソッドは、実際に創造的である
hackjutsu

3
これはプリミティブ型の非常に良い答えです。あなたは天才です。
HalilİbrahimOymacı2016年

2
それがうことを除いて、失敗のためにInteger.MIN_VALUE(または使用されている方プリミティブ)。sort()では、の方が良いreverse()でしょうが、Arrays.reverse()実装を追加していなかったため、自分でリバースを行う必要があります。
Andreas

1
@HalilイブラヒムOymacı:-array構文は私のために動作しません:「悪いオペランドの型int []単項演算子のための『 - 』」
ラインの

8
@line配列には-1を複数指定する必要があります。上記のコードは疑似コードです。forループで配列に-1を複数回してArray.sort()メソッドを呼び出すことができます。最後に、配列に-1を複数回繰り返します。
HalilİbrahimOymacı2017

47

明示的なコンパレータなし:

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

明示的なコンパレータ付き:

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

10

Java 8:

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

更新: reversed()指定したコンパレータを逆にします。通常、コンパレータは昇順で並べ替えられるため、降順に変更されます。


1
オブジェクトでは完全に機能しますが、プリミティブでは機能しません。ソートプリミティブintの場合、ASC順にソートしてから、答えを逆にする必要があります。
Russell Sk。

5

プリミティブの要素を含む配列の場合、org.apache.commons.lang(3)(並べ替えた後で)配列を逆にする簡単な方法があります。

ArrayUtils.reverse(array);

1
最初に昇順で並べ替えてから、外部ライブラリを使用してこの順序を元に戻すのはなぜですか?
Betlista 2014

そしてその一歩は?
Josip Maslac 2014

5
はい(ただし、これらの回答へのコメントで述べたように)、私の回答が対応するプリミティブでは機能しません。もちろん、私の答えは確かに最適なものではありませんが、元の著者が強調した「簡単」であるという基準を満たすことがわかりました。Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac 2014

5

まず、以下を使用して配列をソートする必要があります。

Collections.sort(Myarray);

次に、次を使用して昇順から降順に順序を逆にする必要があります。

Collections.reverse(Myarray);

4

私はあなたのユースケースが何であったかわかりませんが、ここでの他の回答に加えて、別の(遅延)オプションは、指定した昇順でソートすることですが、代わりに逆順で繰り返します。


4

これは、ソートプリミティブ(すなわち、の配列を逆に直接ことはできませんint[] arr = {1, 2, 3};)を使用Arrays.sort()し、Collections.reverseOrder()これらの方法は、参照型(必要とするので、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]

3

別の解決策は、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;
}

どこ大きさは、データ型を持つ属性である二重の私のプログラムインチ これは、定義されたクラス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)、ソートされた配列を返すwhichを呼び出すだけですfreq [] mFreq

このソリューションの美しさ(私の意見では)は、ユーザー定義のクラスを並べ替えるために使用できること、さらには特定の属性によってそれらを並べ替えることができることです。Comparableインターフェースの実装が気の遠くなるような場合は、そのように考えないようにしてください。実際にはそうではありません。比較を実装する方法に関するこのリンクは、物事を私にとってはるかに簡単にしました。人がこの解決策を利用できることを望み、あなたの喜びは私のものに匹敵することになるでしょう。


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

または

array.sort(function(a, b) {return a - b;}); //ascending

5
それはJavaの質問とどのように関連していますか?
ドミトリーギン

0

私はこれがかなり古いスレッドであることを知っていますが、ここにIntegersとJava 8の更新バージョンがあります。

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

通常の昇順(またはComparator.comparingInt())では「o1-o2」であることに注意してください。

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

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

1
これは、プリミティブ型の配列ではなく、参照型配列に対してのみ機能します。
キンバウディ

0

これは私のために働きました:

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
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

ストリーム操作(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));

または、降順(逆順)で出力するには、コンパレータを使用して順序を逆にするソートされたメソッドを使用できます。

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

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


0

ここで起こっている多くの混乱があります-人々は非プリミティブ値の解決策を提案し、地面からいくつかの並べ替えアルゴを実装しようとし、追加のライブラリを含む解決策を与え、いくつかのハックなものを見せびらかします。元の質問に対する答えは50です/ 50。コピー/貼り付けしたいだけの場合:

// our initial int[] array containing primitives
int[] arrOfPrimitives = new int[]{1,2,3,4,5,6};

// we have to convert it into array of Objects, using java's boxing
Integer[] arrOfObjects = new Integer[arrOfPrimitives.length];
for (int i = 0; i < arrOfPrimitives.length; i++) 
    arrOfObjects[i] = new Integer(arrOfPrimitives[i]);

// now when we have an array of Objects we can use that nice built-in method
Arrays.sort(arrOfObjects, Collections.reverseOrder());

arrOfObjectsである{6,5,4,3,2,1}今。ints以外の配列がある場合-の代わりに対応するオブジェクトを使用してくださいInteger


0

上記の議論のために、これはプリミティブ配列を降順にソートする簡単な例です。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = { 5, 4, 1, 2, 9, 7, 3, 8, 6, 0 };
        Arrays.sort(nums);

        // reverse the array, just like dumping the array!
        // swap(1st, 1st-last) <= 1st: 0, 1st-last: nums.length - 1
        // swap(2nd, 2nd-last) <= 2nd: i++,  2nd-last: j--
        // swap(3rd, 3rd-last) <= 3rd: i++,  3rd-last: j--
        //
        for (int i = 0, j = nums.length - 1, tmp; i < j; i++, j--) {
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

        // dump the array (for Java 4/5/6/7/8/9)
        for (int i = 0; i < nums.length; i++) {
            System.out.println("nums[" + i + "] = " + nums[i]);
        }
    }
}

出力:

nums[0] = 9
nums[1] = 8
nums[2] = 7
nums[3] = 6
nums[4] = 5
nums[5] = 4
nums[6] = 3
nums[7] = 2
nums[8] = 1
nums[9] = 0

0

int配列を降順に並べ替える簡単な方法:

private static int[] descendingArray(int[] array) {
    Arrays.sort(array);
    int[] descArray = new int[array.length];
    for(int i=0; i<array.length; i++) {
        descArray[i] = array[(array.length-1)-i];
    }
    return descArray;
}

-1

コンパレータの別の方法

import java.util.Arrays;
import java.util.Comparator;
...

Integer[] aInt = {6,2,3,4,1,5,7,8,9,10};
Arrays.sort(aInt, Comparator.reverseOrder()  );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.