Arrays.sort()tidak dapat digunakan secara langsung untuk mengurutkan array primitif dalam urutan menurun. Jika Anda mencoba memanggil Arrays.sort()metode dengan melewati pembanding terbalik yang ditentukan oleh Collections.reverseOrder(), itu akan membuang kesalahan
tidak ditemukan metode yang cocok untuk sort (int [], pembanding)
Itu akan bekerja dengan baik dengan 'Array Objek' seperti array Integer tetapi tidak akan bekerja dengan array primitif seperti array int.
Satu-satunya cara untuk mengurutkan array primitif dalam urutan menurun adalah, pertama-tama mengurutkan array dalam urutan naik dan kemudian membalikkan array di tempat. Ini juga berlaku untuk array primitif dua dimensi.
Ubah primitif Anda menjadi objek masing-masing. Integer untuk int, Double untuk double, Boolean untuk boolean, dll.
Ismael
12
jika Anda masih ingin menggunakan komparator khusus :Collections.reverseOrder(this)
Sebastian Hojas
Collections.reverseOrder () tidak mengambil parameter (kecuali saya melewatkan sesuatu?), Sebagai gantinya saya menggunakan myComparator.reversed ().
jsaven
1
Array.sort () tidak dapat digunakan secara langsung untuk mengurutkan array primitif dalam urutan menurun. Jika Anda mencoba memanggil metode Arrays.sort () dengan melewati pembanding terbalik yang didefinisikan oleh Collection.reverseOrder (), ia akan melempar kesalahan - "tidak ada metode yang cocok untuk sortir (int [], komparator <object>)" Itu akan berfungsi dengan baik dengan integer array tetapi tidak akan bekerja dengan array int. Satu-satunya cara untuk mengurutkan array primitif dalam urutan menurun adalah, pertama-tama mengurutkan array dalam urutan naik dan kemudian membalikkan array di tempat. Ini juga berlaku untuk array primitif dua dimensi.
int [] array = {2,4,3,6,8,7}; Arrays.sort (array, Collections.reverseOrder ()); memberi saya kesalahan! Kesalahan adalah: "Metode sort (int []) pada tipe Array tidak berlaku untuk argumen (int [], Comparator <Object>)"
Dixit Singla
8
int bukan Obyek. Coba gunakan Integer [] sebagai gantinya.
Ornithopter
6
int adalah tipe utama sedangkan Integer tidak. Itu sebabnya Integer memiliki metode seperti parse, toString, dll.
Ornithopter
91
Anda bisa menggunakan ini:
Arrays.sort(data,Collections.reverseOrder());
Collections.reverseOrder()mengembalikan Comparatormenggunakan urutan alami terbalik. Anda bisa mendapatkan versi pembanding dari komparator Anda sendiri menggunakan Collections.reverseOrder(myComparator).
Metode ini sebenarnya kreatif jika kita mengurutkan angka, meskipun tidak generik dan dapat menyebabkan masalah untuk meluap ...
hackjutsu
3
Ini jawaban yang sangat bagus untuk tipe primitif. Kamu jenius.
Halil İbrahim Oymacı
2
Kecuali itu akan gagal untuk Integer.MIN_VALUE(atau mana primitif digunakan). Akan lebih baik untuk sort(), maka reverse(), tetapi Anda harus melakukan membalikkan sendiri, karena mereka tidak menambahkan Arrays.reverse()implementasi.
Andreas
1
@Halil İbrahim Oymacı: -array syntax tidak bekerja untuk saya: "bad operan type int [] untuk operator unary '-'"
Line
8
@ line Anda harus mengalikan -1 ke array. Kode di atas adalah kode semu. Anda dapat mengalikan -1 ke array dalam for loop lalu memanggil metode Array.sort (), terakhir Anda mengalikan -1 ke array lagi.
Ini berfungsi sempurna dengan Objects tetapi tidak dengan primitif. Untuk mengurutkan primitif int, Anda harus mengurutkan dalam urutan ASC dan kemudian membalikkan jawabannya.
Russell Sk.
5
Untuk array yang mengandung elemen primitif jika ada, org.apache.commons.lang(3)cara mudah untuk membalikkan array (setelah mengurutkannya) adalah dengan menggunakan:
Mengapa mengurutkannya terlebih dahulu dalam urutan naik dan kemudian menggunakan perpustakaan eksternal untuk mengembalikan urutan ini, ketika itu dapat dilakukan dalam satu langkah?
Betlista
Dan satu langkah itu?
Josip Maslac
5
Ya tapi (sebagaimana dinyatakan dalam komentar untuk jawaban itu) yang tidak berfungsi untuk primitif yang saya jawab menjawab. Tentu jawaban saya tentu bukan yang optimal tetapi saya menemukan itu untuk memenuhi kriteria "mudah" yang ditekankan oleh penulis asli - yaitu. Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac
5
Pertama, Anda perlu mengurutkan array menggunakan:
Collections.sort(Myarray);
Maka Anda perlu membalik urutan dari naik ke turun menggunakan:
Saya tidak tahu apa itu use case Anda, namun selain jawaban lain di sini, pilihan lain (malas) adalah masih mengurutkan dalam urutan naik seperti yang Anda tunjukkan tetapi kemudian beralih dalam urutan terbalik .
Tidak mungkin secara langsung membalik urutan array primitif (yaitu, int[] arr = {1, 2, 3};) menggunakan Arrays.sort()dan Collections.reverseOrder()karena metode tersebut memerlukan tipe referensi ( Integer) alih-alih tipe primitif ( int).
Namun, kita bisa menggunakan Java 8 Stream untuk pertama-tama mengotak array untuk mengurutkan dalam urutan terbalik:
// an array of intsint[] arr ={1,2,3,4,5,6};// an array of reverse sorted intsint[] 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]
Solusi lain adalah bahwa jika Anda menggunakan antarmuka Sebanding Anda dapat mengganti nilai-nilai output yang telah Anda tentukan dalam compareTo Anda (Obyek bCompared).
Di mana magnitude adalah atribut dengan datatype double dalam program saya. Ini sedang mengurutkan freq kelas yang saya tentukan dalam urutan terbalik dengan besarnya. Jadi untuk memperbaikinya, Anda mengganti nilai yang dikembalikan oleh <dan >. Ini memberi Anda hal berikut:
Untuk memanfaatkan perbandingan ini, kami cukup memanggil Arrays.sort(mFreq)yang akan memberi Anda array yang diurutkan freq [] mFreq.
Keindahan (menurut saya) dari solusi ini adalah dapat digunakan untuk mengurutkan kelas yang ditentukan pengguna, dan bahkan lebih dari itu mengurutkan mereka berdasarkan atribut tertentu. Jika implementasi antarmuka Sebanding terdengar menakutkan bagi Anda, saya mendorong Anda untuk tidak berpikir seperti itu, sebenarnya tidak. Tautan ini tentang cara menerapkan hal yang sebanding membuat saya lebih mudah. Orang yang berharap dapat memanfaatkan solusi ini, dan bahwa kegembiraan Anda bahkan akan sebanding dengan milik saya.
Ini hanya berfungsi untuk array tipe referensi, bukan array tipe primitif.
kimbaudi
0
Ini bekerja untuk saya:
package doublearraysort;import java.util.Arrays;import java.util.Collections;publicclassGpa{publicstaticvoid main(String[] args){// initializing unsorted double arrayDouble[] dArr =newDouble[]{newDouble(3.2),newDouble(1.2),newDouble(4.7),newDouble(3.3),newDouble(4.6),};// print all the elements available in listfor(double number : dArr){System.out.println("GPA = "+ number);}// sorting the arrayArrays.sort(dArr,Collections.reverseOrder());// print all the elements available in list againSystem.out.println("The sorted GPA Scores are:");for(double number : dArr){System.out.println("GPA = "+ number);}}}
publicdouble[] sortArrayAlgorithm(double[] array){//sort in descending orderfor(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;}
cukup gunakan metode ini untuk mengurutkan array tipe ganda dalam urutan menurun, Anda dapat menggunakannya untuk mengurutkan array tipe lain (seperti int, float, dan lain-lain) hanya dengan mengubah "tipe pengembalian", "tipe argumen" dan tipe variabel "x" ke tipe yang sesuai. Anda juga dapat mengubah "> =" menjadi "<=" dalam kondisi if untuk membuat pesanan naik.
Ada banyak kekacauan yang terjadi di sini - orang menyarankan solusi untuk nilai-nilai non-primitif, mencoba menerapkan beberapa pengurutan algo dari tanah, memberikan solusi yang melibatkan perpustakaan tambahan, memamerkan beberapa yang hacky dll. Jawaban untuk pertanyaan asli adalah 50 / 50. Bagi mereka yang hanya ingin menyalin / menempel:
// our initial int[] array containing primitivesint[] arrOfPrimitives =newint[]{1,2,3,4,5,6};// we have to convert it into array of Objects, using java's boxingInteger[] arrOfObjects =newInteger[arrOfPrimitives.length];for(int i =0; i < arrOfPrimitives.length; i++)
arrOfObjects[i]=newInteger(arrOfPrimitives[i]);// now when we have an array of Objects we can use that nice built-in methodArrays.sort(arrOfObjects,Collections.reverseOrder());
arrOfObjectsadalah {6,5,4,3,2,1}sekarang. Jika Anda memiliki array sesuatu selain int - gunakan objek yang sesuai, bukan Integer.
Ada baiknya kadang-kadang kita berlatih melalui contoh, ini contoh lengkapnya:
sortdesc.java
import java.util.Arrays;import java.util.Collections;class sortdesc{publicstaticvoid main(String[] args){// int ArrayInteger[] intArray=newInteger[]{newInteger(15),newInteger(9),newInteger(16),newInteger(2),newInteger(30)};// Sorting int Array in descending orderArrays.sort(intArray,Collections.reverseOrder());// Displaying elements of int ArraySystem.out.println("Int Array Elements in reverse order:");for(int i=0;i<intArray.length;i++)System.out.println(intArray[i]);// String ArrayString[] stringArray=newString[]{"FF","PP","AA","OO","DD"};// Sorting String Array in descending orderArrays.sort(stringArray,Collections.reverseOrder());// Displaying elements of String ArraySystem.out.println("String Array Elements in reverse order:");for(int i=0;i<stringArray.length;i++)System.out.println(stringArray[i]);}}
mengkompilasinya ...
javac sortdec.java
menyebutnya ...
java sortdesc
KELUARAN
IntArrayElements in reverse order:30161592StringArrayElements in reverse order:
PP
OO
FF
DD
AA
Jika Anda ingin mencoba larik alfanumerik ...
//replace this line:String[] stringArray=newString[]{"FF","PP","AA","OO","DD"};//with this:String[] stringArray=newString[]{"10FF","20AA","50AA"};
Jawaban:
Anda dapat menggunakan ini untuk mengurutkan semua jenis Objek
Arrays.sort()
tidak dapat digunakan secara langsung untuk mengurutkan array primitif dalam urutan menurun. Jika Anda mencoba memanggilArrays.sort()
metode dengan melewati pembanding terbalik yang ditentukan olehCollections.reverseOrder()
, itu akan membuang kesalahanItu akan bekerja dengan baik dengan 'Array Objek' seperti array Integer tetapi tidak akan bekerja dengan array primitif seperti array int.
Satu-satunya cara untuk mengurutkan array primitif dalam urutan menurun adalah, pertama-tama mengurutkan array dalam urutan naik dan kemudian membalikkan array di tempat. Ini juga berlaku untuk array primitif dua dimensi.
sumber
Collections.reverseOrder(this)
untuk daftar
untuk sebuah array
sumber
Anda bisa menggunakan ini:
Collections.reverseOrder()
mengembalikanComparator
menggunakan urutan alami terbalik. Anda bisa mendapatkan versi pembanding dari komparator Anda sendiri menggunakanCollections.reverseOrder(myComparator)
.sumber
Collections.sort()
mengambilList
parameter input sebagai, bukan array.sebuah alternatif bisa jadi (untuk angka !!!)
Diucapkan secara harfiah:
sumber
Integer.MIN_VALUE
(atau mana primitif digunakan). Akan lebih baik untuksort()
, makareverse()
, tetapi Anda harus melakukan membalikkan sendiri, karena mereka tidak menambahkanArrays.reverse()
implementasi.tanpa pembanding eksplisit:
dengan pembanding eksplisit:
sumber
Java 8:
Pembaruan:
reversed()
membalikkan pembanding yang ditentukan. Biasanya, pembanding memesan naik, jadi ini mengubah urutan ke turun.sumber
Untuk array yang mengandung elemen primitif jika ada,
org.apache.commons.lang(3)
cara mudah untuk membalikkan array (setelah mengurutkannya) adalah dengan menggunakan:sumber
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Pertama, Anda perlu mengurutkan array menggunakan:
Maka Anda perlu membalik urutan dari naik ke turun menggunakan:
sumber
Saya tidak tahu apa itu use case Anda, namun selain jawaban lain di sini, pilihan lain (malas) adalah masih mengurutkan dalam urutan naik seperti yang Anda tunjukkan tetapi kemudian beralih dalam urutan terbalik .
sumber
Tidak mungkin secara langsung membalik urutan array primitif (yaitu,
int[] arr = {1, 2, 3};
) menggunakanArrays.sort()
danCollections.reverseOrder()
karena metode tersebut memerlukan tipe referensi (Integer
) alih-alih tipe primitif (int
).Namun, kita bisa menggunakan Java 8 Stream untuk pertama-tama mengotak array untuk mengurutkan dalam urutan terbalik:
sumber
Solusi lain adalah bahwa jika Anda menggunakan antarmuka Sebanding Anda dapat mengganti nilai-nilai output yang telah Anda tentukan dalam compareTo Anda (Obyek bCompared).
Sebagai contoh :
Di mana magnitude adalah atribut dengan datatype double dalam program saya. Ini sedang mengurutkan freq kelas yang saya tentukan dalam urutan terbalik dengan besarnya. Jadi untuk memperbaikinya, Anda mengganti nilai yang dikembalikan oleh
<
dan>
. Ini memberi Anda hal berikut:Untuk memanfaatkan perbandingan ini, kami cukup memanggil
Arrays.sort(mFreq)
yang akan memberi Anda array yang diurutkanfreq [] mFreq
.Keindahan (menurut saya) dari solusi ini adalah dapat digunakan untuk mengurutkan kelas yang ditentukan pengguna, dan bahkan lebih dari itu mengurutkan mereka berdasarkan atribut tertentu. Jika implementasi antarmuka Sebanding terdengar menakutkan bagi Anda, saya mendorong Anda untuk tidak berpikir seperti itu, sebenarnya tidak. Tautan ini tentang cara menerapkan hal yang sebanding membuat saya lebih mudah. Orang yang berharap dapat memanfaatkan solusi ini, dan bahwa kegembiraan Anda bahkan akan sebanding dengan milik saya.
sumber
atau
sumber
Saya tahu bahwa ini adalah utas yang cukup lama, tetapi ini adalah versi terbaru untuk Integer dan Java 8:
Perhatikan bahwa itu adalah "o1 - o2" untuk urutan naik normal (atau Comparator.comparingInt ()).
Ini juga berfungsi untuk Objek lain. Mengatakan:
sumber
Ini bekerja untuk saya:
Keluaran:
sumber
cukup gunakan metode ini untuk mengurutkan array tipe ganda dalam urutan menurun, Anda dapat menggunakannya untuk mengurutkan array tipe lain (seperti int, float, dan lain-lain) hanya dengan mengubah "tipe pengembalian", "tipe argumen" dan tipe variabel "x" ke tipe yang sesuai. Anda juga dapat mengubah "> =" menjadi "<=" dalam kondisi if untuk membuat pesanan naik.
sumber
Anda bisa menggunakan operasi streaming ( Collections.stream () ) dengan Comparator.reverseOrder () .
Misalnya, Anda memiliki koleksi ini:
Untuk mencetak item dalam urutan "alami" Anda, Anda dapat menggunakan metode diurutkan () (atau tinggalkan dan dapatkan hasil yang sama):
Atau untuk mencetaknya dalam urutan menurun (mundur), Anda bisa menggunakan metode yang diurutkan yang mengambil pembanding dan membalikkan urutan:
Catatan ini membutuhkan koleksi untuk mengimplementasikan Sebanding (seperti halnya Integer, String, dll.).
sumber
Ada banyak kekacauan yang terjadi di sini - orang menyarankan solusi untuk nilai-nilai non-primitif, mencoba menerapkan beberapa pengurutan algo dari tanah, memberikan solusi yang melibatkan perpustakaan tambahan, memamerkan beberapa yang hacky dll. Jawaban untuk pertanyaan asli adalah 50 / 50. Bagi mereka yang hanya ingin menyalin / menempel:
arrOfObjects
adalah{6,5,4,3,2,1}
sekarang. Jika Anda memiliki array sesuatu selain int - gunakan objek yang sesuai, bukanInteger
.sumber
Untuk diskusi di atas, berikut adalah contoh mudah untuk mengurutkan array primitif dalam urutan menurun.
Keluaran:
sumber
Metode sederhana untuk mengurutkan array int turun:
sumber
Cara lain dengan Comparator
sumber
Ada baiknya kadang-kadang kita berlatih melalui contoh, ini contoh lengkapnya:
sortdesc.java
mengkompilasinya ...
menyebutnya ...
KELUARAN
Jika Anda ingin mencoba larik alfanumerik ...
Anda akan mendapatkan OUTPUT sebagai berikut:
sumber
sumber