Czy istnieje ŁATWY sposób sortowania tablicy w porządku malejącym, na przykład sposób sortowania w porządku rosnącym w klasie Arrays ?
Czy też muszę przestać być leniwy i zrobić to sam: [
Czy istnieje ŁATWY sposób sortowania tablicy w porządku malejącym, na przykład sposób sortowania w porządku rosnącym w klasie Arrays ?
Czy też muszę przestać być leniwy i zrobić to sam: [
Odpowiedzi:
Możesz użyć tego do sortowania wszelkiego rodzaju obiektów
sort(T[] a, Comparator<? super T> c)
Arrays.sort(a, Collections.reverseOrder());
Arrays.sort()
nie można go użyć bezpośrednio do sortowania pierwotnych tablic w kolejności malejącej. Jeśli spróbujesz wywołać Arrays.sort()
metodę, przekazując zdefiniowany przez siebie odwrotny komparator Collections.reverseOrder()
, spowoduje to zgłoszenie błędu
nie znaleziono odpowiedniej metody sortowania (int [], komparator)
Będzie to działać poprawnie z „Array of Objects”, takim jak tablica liczb całkowitych, ale nie będzie działać z prymitywną tablicą, taką jak tablica int.
Jedynym sposobem na posortowanie pierwotnej tablicy w porządku malejącym jest najpierw posortowanie tablicy w kolejności rosnącej, a następnie odwrócenie tablicy na miejscu. Dotyczy to również dwuwymiarowych pierwotnych tablic.
Collections.reverseOrder(this)
na listę
Collections.sort(list, Collections.reverseOrder());
dla tablicy
Arrays.sort(array, Collections.reverseOrder());
Możesz użyć tego:
Arrays.sort(data, Collections.reverseOrder());
Collections.reverseOrder()
zwraca Comparator
użycie odwrotnego porządku naturalnego. Możesz uzyskać odwróconą wersję własnego komparatora za pomocą Collections.reverseOrder(myComparator)
.
Collections.sort()
przyjmuje List
jako parametr wejściowy, a nie tablicę.
alternatywą może być (dla liczb !!!)
Dosłownie mówione:
array = -Arrays.sort(-array)
Integer.MIN_VALUE
(lub cokolwiek prymitywne jest używany). Byłoby lepiej sort()
, a potem reverse()
, ale będziesz musiał zrobić to cofanie się, ponieważ nie dodają Arrays.reverse()
implementacje.
Java 8:
Arrays.sort(list, comparator.reversed());
Aktualizacja:
reversed()
odwraca określony komparator. Zwykle komparatory porządkują rosnąco, więc zmienia to kolejność malejącą.
W przypadku tablicy zawierającej elementy prymitywów, jeśli istnieje możliwość org.apache.commons.lang(3)
łatwego odwrócenia tablicy (po jej posortowaniu), należy użyć:
ArrayUtils.reverse(array);
Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Nie jest możliwe bezpośrednie odwrócenie sortowania tablicy prymitywów (tj. int[] arr = {1, 2, 3};
) Przy użyciu Arrays.sort()
i Collections.reverseOrder()
ponieważ metody te wymagają typów referencyjnych ( Integer
) zamiast typów prymitywnych (int
).
Możemy jednak użyć strumienia Java 8, aby najpierw spakować tablicę do sortowania w odwrotnej kolejności:
// 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]
Innym rozwiązaniem jest skorzystanie z Porównywalnego interfejsu , możesz przełączać wartości wyjściowe, które określiłeś w porównawczym (Object bCompared).
Na przykład :
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;
}
Gdzie wielkość jest atrybutem z podwójnym typem danych w moim programie. To sortowało moją zdefiniowaną częstotliwość klas w odwrotnej kolejności według wielkości. Aby to naprawić, przełączasz wartości zwracane przez <
i >
. To daje następujące możliwości:
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;
}
Aby skorzystać z tego porównania, po prostu wywołujemy, Arrays.sort(mFreq)
co daje posortowaną tablicęfreq [] mFreq
.
Zaletą (moim zdaniem) tego rozwiązania jest to, że można go stosować do sortowania klas zdefiniowanych przez użytkownika, a nawet więcej, do sortowania ich według określonego atrybutu. Jeśli implementacja porównywalnego interfejsu wydaje ci się zniechęcająca, zachęcam do tego, abyś nie myślał w ten sposób, w rzeczywistości tak nie jest. To link, jak wdrożyć porównywalne , znacznie ułatwił mi życie. Mam nadzieję, że osoby skorzystają z tego rozwiązania i że twoja radość będzie nawet porównywalna z moją.
array.sort(function(a, b) {return b - a;}); //descending
lub
array.sort(function(a, b) {return a - b;}); //ascending
Wiem, że jest to dość stary wątek, ale tutaj jest zaktualizowana wersja dla Integers i Java 8:
Arrays.sort(array, (o1, o2) -> o2 - o1);
Zauważ, że jest to „o1 - o2” dla normalnego porządku rosnącego (lub Comparator.comparingInt ()).
Działa to również w przypadku innych rodzajów obiektów. Mówić:
Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue());
To działało dla mnie:
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);
}
}
}
Wynik:
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
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;
}
wystarczy użyć tej metody do sortowania tablicy typu double w porządku malejącym, można jej użyć do sortowania tablic dowolnych innych typów (takich jak int, float itp.), po prostu zmieniając „typ zwracany”, „typ argumentu” i typ zmiennej „x” do odpowiedniego typu. możesz także zmienić „> =” na „<=” w warunku if, aby kolejność rosła.
Możesz użyć operacji strumieniowych ( Collections.stream () ) za pomocą Comparator.reverseOrder () .
Powiedzmy, że masz tę kolekcję:
List<String> items = new ArrayList<>();
items.add("item01");
items.add("item02");
items.add("item03");
items.add("item04");
items.add("item04");
Aby wydrukować elementy w ich „naturalnej” kolejności, możesz użyć metody sorted () (lub pominąć ją i uzyskać ten sam wynik):
items.stream()
.sorted()
.forEach(item -> System.out.println(item));
Lub, aby wydrukować je w malejącej (odwrotnej) kolejności, możesz użyć posortowanej metody, która pobiera Komparator i odwrócić kolejność:
items.stream()
.sorted(Comparator.reverseOrder())
.forEach(item -> System.out.println(item));
Zauważ, że wymaga to, aby kolekcja zaimplementowała Porównywalne (podobnie jak Liczba całkowita, Ciąg itp.).
Tutaj dzieje się dużo bałaganu - ludzie sugerują rozwiązania dla prymitywnych wartości, próbują zaimplementować niektóre algorytmy sortujące z ziemi, dają rozwiązania obejmujące dodatkowe biblioteki, popisujące się kilkoma hackami itp. Odpowiedź na pierwotne pytanie to 50 / 50. Dla tych, którzy chcą tylko skopiować / wkleić:
// 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
jest {6,5,4,3,2,1}
teraz. Jeśli masz tablicę czegoś innego niż ints - użyj odpowiedniego obiektu zamiast Integer
.
W powyższych dyskusjach oto prosty przykład sortowania prymitywnych tablic w kolejności malejącej.
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]);
}
}
}
Wynik:
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
Czasami ćwiczymy na przykładzie, tutaj jest pełny:
sortdesc.java
import java.util.Arrays;
import java.util.Collections;
class sortdesc{
public static void main(String[] args){
// int Array
Integer[] intArray=new Integer[]{
new Integer(15),
new Integer(9),
new Integer(16),
new Integer(2),
new Integer(30)};
// Sorting int Array in descending order
Arrays.sort(intArray,Collections.reverseOrder());
// Displaying elements of int Array
System.out.println("Int Array Elements in reverse order:");
for(int i=0;i<intArray.length;i++)
System.out.println(intArray[i]);
// String Array
String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};
// Sorting String Array in descending order
Arrays.sort(stringArray,Collections.reverseOrder());
// Displaying elements of String Array
System.out.println("String Array Elements in reverse order:");
for(int i=0;i<stringArray.length;i++)
System.out.println(stringArray[i]);}}
kompilowanie ...
javac sortdec.java
nazywając to ...
java sortdesc
WYNIK
Int Array Elements in reverse order:
30
16
15
9
2
String Array Elements in reverse order:
PP
OO
FF
DD
AA
Jeśli chcesz wypróbować tablicę alfanumeryczną ...
//replace this line:
String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};
//with this:
String[] stringArray=new String[]{"10FF","20AA","50AA"};
otrzymasz WYJŚCIE w następujący sposób:
50AA
20AA
10FF