Упорядочить массив убыванию java

Java Array Sort descending?

Arrays.sort() cannot be used directly to sort primitive arrays in descending order. If you try to call the Arrays.sort() method by passing reverse Comparator defined by Collections.reverseOrder() , it will throw the error

no suitable method found for sort(int[],comparator)

That will work fine with ‘Array of Objects’ such as Integer array but will not work with a primitive array such as int array.

The only way to sort a primitive array in descending order is, first sort the array in ascending order and then reverse the array in place. This is also true for two-dimensional primitive arrays.

Convert your primitives to their respective objects. Integer for int, Double for double, Boolean for boolean, etc.

Collections.reverseOrder() takes no parameters (unless I’m missing something?), instead I used myComparator.reversed().

I use this (example): Comparator notificationDataComparator = Collections.reverseOrder(GenericComparator .createComparator(AdMessage.CREATED_AT_COMPARATOR)); Collections.sort(allMessageList, notificationDataComparator);

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

int []array = <2,4,3,6,8,7>; Arrays.sort(array, Collections.reverseOrder()); is giving me an error! Error is: «The method sort(int[]) in the type Arrays is not applicable for the arguments (int[], Comparator)»

int is a primary type while Integer is not. That’s why Integer has methods like parse, toString, etc.

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

Collections.reverseOrder() returns a Comparator using the inverse natural order. You can get an inverted version of your own comparator using Collections.reverseOrder(myComparator) .

an alternative could be (for numbers. )

This method is actually creative if we are sorting numbers, even though it is not generic and could cause problems for overflow.

Except that it’ll fail for Integer.MIN_VALUE (or whichever primitive is used). Would be better to sort() , then reverse() , but you’ll have to do the reversing yourself, since they didn’t add Arrays.reverse() implementations.

@Halil İbrahim Oymacı: -array syntax doesn’t work for me: «bad operand type int[] for unary operator ‘-‘»

@line You must multiple -1 to array. Above code is pseudo code. You can multiple -1 to array in a for loop then call Array.sort() method, lastly you multiple -1 to array again.

without explicit comparator:

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

It’s not directly possible to reverse sort an array of primitives (i.e., int[] arr = ; ) using Arrays.sort() and Collections.reverseOrder() because those methods require reference types ( Integer ) instead of primitive types ( int ).

However, we can use Java 8 Stream to first box the array to sort in reverse order:

// an array of ints int[] arr = ; // 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] 

I’m assuming the time complexity is still O(nlgn) since streaming the values and mapping them are done on the same «level» (meaning the time complexity of this whole code is something like (n + nlgn + n)? But please correct me if I’m wrong.

First you need to sort your array using:

Then you need to reverse the order from ascending to descending using:

Collections.reverse(myArray); 
Arrays.sort(list, comparator.reversed()); 

Update: reversed() reverses the specified comparator. Usually, comparators order ascending, so this changes the order to descending.

It’s work perfectly with Objects but not with primitives. For sort primitive int, you should sort in ASC order and then reverse the answer.

When an array is a type of Integer class then you can use below:

Integer[] arr = ; Arrays.sort(arr, Collections.reverseOrder()); 

When an array is a type of int data type then you can use below:

int[] arr = ; int[] reverseArr = IntStream.rangeClosed(1, arr.length).map(i -> arr[arr.length-i]).toArray(); 

For array which contains elements of primitives if there is org.apache.commons.lang(3) at disposal easy way to reverse array (after sorting it) is to use:

Why to sort it first in ascending order and then use external library to revert this order, when it can be done in one step?

Yes but (as stated in the comments to those answers) that doesn’t work for primitives which my answer address. Ofcourse my answer is certainly not the optimal one but I found it to meet the criteria of being «easy» which the original author emphasized — ie. Arrays.sort(primitives); ArrayUtils.reverse(primitives);

I don’t know what your use case was, however in addition to other answers here another (lazy) option is to still sort in ascending order as you indicate but then iterate in reverse order instead.

For discussions above, here is an easy example to sort the primitive arrays in descending order.

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) // dump the array (for Java 4/5/6/7/8/9) for (int i = 0; i < nums.length; i++) < System.out.println("nums[" + i + "] mt24"> 
)" data-controller="se-share-sheet" data-se-share-sheet-title="Share a link to this answer" data-se-share-sheet-subtitle="" data-se-share-sheet-post-type="answer" data-se-share-sheet-social="facebook twitter devto" data-se-share-sheet-location="2" data-se-share-sheet-license-url="https%3a%2f%2fcreativecommons.org%2flicenses%2fby-sa%2f4.0%2f" data-se-share-sheet-license-name="CC BY-SA 4.0" data-s-popover-placement="bottom-start">Share
)" title="">Improve this answer
answered Oct 10, 2019 at 5:51
Add a comment |
3

Another solution is that if you're making use of the Comparable interface you can switch the output values which you had specified in your compareTo(Object bCompared).

For Example :

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

Where magnitude is an attribute with datatype double in my program. This was sorting my defined class freq in reverse order by it's magnitude. So in order to correct that, you switch the values returned by the < and >. This gives you the following :

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

To make use of this compareTo, we simply call Arrays.sort(mFreq) which will give you the sorted array freq [] mFreq .

The beauty (in my opinion) of this solution is that it can be used to sort user defined classes, and even more than that sort them by a specific attribute. If implementation of a Comparable interface sounds daunting to you, I'd encourage you not to think that way, it actually isn't. This link on how to implement comparable made things much easier for me. Hoping persons can make use of this solution, and that your joy will even be comparable to mine.

Источник

Сортировка массива в Java

В этой статье будут обсуждаться различные методы сортировки массива примитивных типов или объектов в Java.

1. Сортировка массива с помощью Arrays.sort() метод

Arrays class предоставляет несколько статических методов для сортировки массивов:

Он сортирует указанный массив типов примитивов или объектов в порядке возрастания в соответствии с естественным порядком его элементов.

У него также есть версия, которая сортирует указанный массив между указанным диапазоном:

Arrays.sort() использует Dual-Pivot Quicksort, который предлагает O(n.log(n)) производительность. Обычно это быстрее, чем традиционный (одноповоротный) Быстрая сортировка реализации.

Он сортирует указанный массив объектов в соответствии с порядком, заданным указанным компаратором. Он требует, чтобы все элементы массива были взаимно сравнимы указанным компаратором, т. е. для любой пары элементов (e1, e2) в массиве, c.compare(e1, e2) не следует бросать ClassCastException .

⮚ Чтобы отсортировать по возрастанию:

⮚ Чтобы отсортировать по убыванию:

Arrays . sort ( arr , Comparator . reverseOrder ( ) ) ; // или используйте `Collections.reverseOrder()`)

Мы также можем написать собственный компаратор, как показано ниже:

Он также предоставляет версию, которая сортирует указанный массив объектов между указанным диапазоном в соответствии с порядком, заданным указанным компаратором:

Результатом такой сортировки является стабильная сортировка, т. е. будет поддерживаться относительный порядок равных элементов. Он использует итеративный Сортировка слиянием что требует гораздо меньше, чем n.log(n) сравнения, когда входной массив частично отсортирован, в противном случае предлагается производительность традиционной сортировки слиянием, когда входной массив упорядочен случайным образом.

2. Сортировка массива с помощью Arrays.parallelSort() метод

Java 8 также предоставляет Arrays.parallelSort() который использует несколько потоков для сортировки, в отличие от Arrays.sort() который использует только один поток для сортировки элементов. Прототип parallelSort() похоже на sort() .

Это бьет Arrays.sort() когда общее количество элементов превышает определенный порог. Внутри любой массив размером меньше порогового значения сортируется с помощью Arrays.sort() . Порог рассчитывается с учетом параллелизма машины и размера массива. Общий пул ForkJoin используется для выполнения любых параллельных задач.

Следующая программа на Java сравнивает производительность Arrays.parallelSort() с Arrays.sort() на огромном наборе данных из 10 миллионов целых чисел:

Источник

Читайте также:  Php установка запуск сервера
Оцените статью