2009-11-07 66 views
210

Có cách nào dễ dàng để sắp xếp một mảng theo thứ tự giảm dần như cách chúng có sắp xếp theo thứ tự tăng dần trong Arrays class không?Java Array Sắp xếp giảm dần?

Hoặc tôi phải dừng lại lười biếng và tự làm điều này: [

Trả lời

247

Bạn có thể sử dụng này

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

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

Nó không thể sắp xếp các mảng nguyên thủy –

+11

Chuyển đổi nguyên thủy của bạn thành các đối tượng tương ứng. Số nguyên cho int, Double cho double, Boolean cho boolean, v.v. – Ishmael

+10

nếu bạn vẫn muốn sử dụng [comparator] tùy chỉnh của bạn (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator .html): 'Collections.reverseOrder (this)' –

84

Bạn có thể sử dụng này:

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

Collections.reverseOrder() trả về một Comparator sử dụng thứ tự nghịch đảo ngược. Bạn có thể nhận phiên bản ngược của bộ so sánh của riêng bạn bằng cách sử dụng Collections.reverseOrder(myComparator).

+6

OP muốn sắp xếp một mảng. 'Collections.sort()' lấy một 'List' làm tham số đầu vào, không phải là một mảng. –

+1

ops, tôi đã viết Bộ sưu tập thay vì Arrays.Its đã chỉnh sửa ngay bây giờ. – William

+2

+1 để giải thích cách sử dụng trình so sánh của riêng bạn. – dj18

74

cho một danh sách

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

cho một mảng

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

int [] array = {2,4,3,6,8,7}; Arrays.sort (mảng, Collections.reverseOrder()); đang cho tôi một lỗi! Lỗi là: "Phương thức sắp xếp (int []) trong loại Mảng không áp dụng cho đối số (int [], Comparator )" –

+3

int không phải là đối tượng. Hãy thử sử dụng Integer [] để thay thế. – Ornithopter

+0

Tại sao Integer [] hoạt động và không int []? – OpMt

3

Đối với mảng chứa các yếu tố của nguyên thủy nếu có org.apache.commons.lang(3) theo ý cách dễ dàng để đảo ngược mảng (sau khi phân loại nó) là sử dụng :

ArrayUtils.reverse(array); 
+1

Tại sao phải sắp xếp nó đầu tiên theo thứ tự tăng dần và sau đó sử dụng thư viện bên ngoài để hoàn nguyên thứ tự này, khi nó có thể được thực hiện trong một bước? – Betlista

+0

Và đó là một bước? –

+0

xem các câu trả lời ở trên - 'Arrays.sort()' với so sánh 'reverseOrder' ... – Betlista

2

Tôi không biết trường hợp sử dụng của bạn là gì, tuy nhiên ngoài o có câu trả lời ở đây khác (lười) tùy chọn là vẫn sắp xếp theo thứ tự tăng dần như bạn chỉ ra nhưng sau đó iterate trong đảo ngược để thay thế.

31

một sự thay thế có thể là (đối với số !!!)

  1. nhân Array bằng -1
  2. loại
  3. nhân một lần nữa với -1

Nghĩa đen nói:

array = -Arrays.sort(-array) 
+16

' {__________ lol ________} ' –

+7

Phương pháp này thực sự sáng tạo nếu chúng ta sắp xếp số, mặc dù nó không phải là chung và có thể gây ra vấn đề cho tràn ... – hackjutsu

+2

Đây là câu trả lời rất tốt cho các kiểu nguyên thủy . Bạn là thiên tài. –

42

không có so sánh rõ ràng r:

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

với so sánh rõ ràng:

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

Java 8:

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

Cập nhật: reversed() đảo ngược so sánh cụ thể. Thông thường, các bộ so sánh thứ tự tăng dần, do đó, điều này thay đổi thứ tự giảm dần.

2

Trước tiên, bạn cần phải sắp xếp mảng bằng cách sử dụng:

 Collections.sort(Myarray); 

Sau đó, bạn cần phải đảo ngược thứ tự từ tăng dần thành giảm dần sử dụng:

 Collections.reverse(Myarray); 
2

Một giải pháp là nếu bạn sử dụng giao diện So sánh, bạn có thể chuyển các giá trị đầu ra mà bạn đã chỉ định trong compareTo của bạn (Object bCompared).

Ví dụ:

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

đâu độ richter là một thuộc tính với datatype đôi trong chương trình của tôi. Điều này đã được phân loại lớp học được xác định của tôi freq theo thứ tự ngược lại bởi độ lớn của nó. Vì vậy, để sửa điều đó, bạn chuyển đổi các giá trị được trả về bởi <>. Điều này giúp bạn như sau:

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

Để tận dụng compareTo này, chúng tôi chỉ cần gọi Arrays.sort(mFreq) mà sẽ cung cấp cho bạn các mảng được sắp xếp freq [] mFreq.

Vẻ đẹp (theo ý kiến ​​của tôi) về giải pháp này là nó có thể được sử dụng để sắp xếp các lớp do người dùng xác định và thậm chí nhiều hơn sắp xếp chúng theo thuộc tính cụ thể. Nếu thực hiện một giao diện Comparable âm thanh khó khăn với bạn, tôi khuyến khích bạn không nghĩ theo cách đó, nó thực sự là không. Điều này link on how to implement comparable làm mọi thứ dễ dàng hơn cho tôi. Hy vọng mọi người có thể tận dụng giải pháp này và niềm vui của bạn thậm chí sẽ là so sánh được với tôi.

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

hoặc

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

Tôi biết rằng đây là một chủ đề khá cũ, nhưng đây là một phiên bản cập nhật cho số nguyên và Java 8:

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

Lưu ý rằng nó là "o1 - o2 "cho thứ tự tăng dần bình thường (hoặc Comparator.comparingInt()).

Điều này cũng phù hợp với mọi loại đối tượng khác. Nói:

Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue()); 
Các vấn đề liên quan