เรียง Java Array เรียงจากมากไปน้อย?


277

มีวิธีง่าย ๆ ในการเรียงลำดับอาร์เรย์เรียงจากมากไปน้อยเช่นวิธีที่พวกเขามีการเรียงลำดับจากน้อยไปมากในชั้นเรียนอาร์เรย์ ?

หรือฉันต้องหยุดขี้เกียจและทำสิ่งนี้ด้วยตัวเอง: [


คำตอบ:


330

คุณสามารถใช้สิ่งนี้เพื่อจัดเรียงวัตถุทุกชนิด

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

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

Arrays.sort()ไม่สามารถใช้โดยตรงเพื่อจัดเรียงอาร์เรย์แบบดั้งเดิมในลำดับจากมากไปน้อย ถ้าคุณพยายามเรียกใช้Arrays.sort()เมธอดด้วยการส่ง reverse Comparator ที่กำหนดโดยCollections.reverseOrder()มันจะทำให้เกิดข้อผิดพลาด

ไม่พบวิธีการที่เหมาะสมสำหรับการจัดเรียง (int [], ตัวเปรียบเทียบ)

ที่จะทำงานได้ดีกับ 'Array of Objects' เช่น Integer array แต่จะไม่ทำงานกับ array ดั้งเดิมเช่น int array

วิธีเดียวที่จะจัดเรียงอาร์เรย์แบบดั้งเดิมในลำดับจากมากไปน้อยคือก่อนอื่นให้เรียงลำดับตามลำดับจากน้อยไปหามาก นี่เป็นความจริงสำหรับอาร์เรย์สองมิติดั้งเดิม


115
ไม่สามารถเรียงลำดับอาร์เรย์ดั้งเดิมได้
Masood_mj

14
แปลงดั้งเดิมของคุณเป็นวัตถุที่เกี่ยวข้อง จำนวนเต็ม int สำหรับคู่สำหรับคู่บูลีนสำหรับบูล ฯลฯ
อิชมาเอ

12
หากคุณยังต้องการใช้เครื่องมือเปรียบเทียบที่กำหนดเองของคุณ:Collections.reverseOrder(this)
Sebastian Hojas

Collections.reverseOrder () ไม่มีพารามิเตอร์ (ยกเว้นว่าฉันทำอะไรหายไป) ฉันใช้ myComparator.reversed () แทน
jsaven

1
Arrays.sort () ไม่สามารถใช้โดยตรงเพื่อจัดเรียงอาร์เรย์แบบดั้งเดิมในลำดับจากมากไปน้อย ถ้าคุณพยายามเรียกใช้ Arrays.sort () โดยการย้อนกลับ Comparator ที่กำหนดโดย Collection.reverseOrder () มันจะโยนข้อผิดพลาด - "ไม่พบวิธีที่เหมาะสมสำหรับการเรียงลำดับ (int [], comparator <object>)" ที่จะ ทำงานได้ดีกับอาร์เรย์จำนวนเต็ม แต่จะไม่ทำงานกับอาร์เรย์ int วิธีเดียวที่จะจัดเรียงอาร์เรย์แบบดั้งเดิมในลำดับจากมากไปน้อยคือก่อนอื่นให้เรียงลำดับตามลำดับจากน้อยไปหามาก นี่เป็นความจริงสำหรับอาร์เรย์สองมิติดั้งเดิม
akuriako

96

สำหรับรายการ

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

สำหรับอาร์เรย์

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

25
int [] array = {2,4,3,6,8,7}; Arrays.sort (อาร์เรย์, Collections.reverseOrder ()); ทำให้ฉันมีข้อผิดพลาด! ข้อผิดพลาดคือ: "วิธีการเรียงลำดับ (int []) ในประเภทอาร์เรย์ไม่สามารถใช้ได้กับข้อโต้แย้ง (int [], Comparator <Object>)"
Dixit Singla

8
int ไม่ใช่วัตถุ ลองใช้ Integer [] แทน
Ornithopter

6
int เป็นประเภทหลักในขณะที่จำนวนเต็มไม่ได้ นั่นเป็นสาเหตุที่ Integer มีวิธีการแยกวิเคราะห์ toString และอื่น ๆ
Ornithopter

91

คุณสามารถใช้สิ่งนี้:

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

Collections.reverseOrder()ส่งคืนการComparatorใช้คำสั่งตามธรรมชาติผกผัน Collections.reverseOrder(myComparator)คุณจะได้รับกลับของรุ่นเปรียบเทียบของคุณเองโดยใช้


8
OP ต้องการเรียงลำดับอาร์เรย์ Collections.sort()ใช้Listเป็นพารามิเตอร์การป้อนข้อมูลไม่อาร์เรย์
Pascal Thivent

61

ทางเลือกอาจเป็น (สำหรับตัวเลข !!!)

  1. คูณ Array ด้วย -1
  2. ประเภท
  3. ทวีคูณอีกครั้งด้วย -1

พูดตามตัวอักษร:

array = -Arrays.sort(-array)

7
วิธีนี้เป็นวิธีที่สร้างสรรค์จริงถ้าเราจะเรียงลำดับตัวเลขถึงแม้ว่ามันจะไม่ได้ทั่วไปและอาจทำให้เกิดปัญหาสำหรับล้น ...
hackjutsu

3
นี่เป็นคำตอบที่ดีมากสำหรับประเภทดั้งเดิม คุณเป็นอัจฉริยะ
Halil İbrahimOymacı

2
ยกเว้นว่ามันจะล้มเหลวสำหรับInteger.MIN_VALUE(หรือแล้วแต่ดั้งเดิมจะใช้) จะดีกว่าsort()แล้วreverse()แต่คุณจะต้องทำย้อนกลับตัวเองเนื่องจากพวกเขาไม่ได้เพิ่มArrays.reverse()การใช้งาน
Andreas

1
@Halil İbrahimOymacı: - ไวยากรณ์ของเรย์ไม่ทำงานสำหรับฉัน: "ตัวถูกดำเนินการชนิดที่ไม่ถูกต้อง int [] สำหรับตัวดำเนินการที่ไม่ได้ใช้ '-'"
บรรทัด

8
@line คุณต้องมีหลาย -1 ในอาร์เรย์ โค้ดด้านบนคือรหัสหลอก คุณสามารถใส่อาเรย์หลาย ๆ อันใน a for loop จากนั้นเรียกใช้ Array.sort () method และสุดท้ายคุณจะได้ -1 ถึงอาร์เรย์อีกครั้ง
Halil İbrahimOymacı

47

ไม่มีตัวเปรียบเทียบที่ชัดเจน:

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

ด้วยตัวเปรียบเทียบที่ชัดเจน:

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

10

Java 8:

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

Update: reversed()ย้อนกลับตัวเปรียบเทียบที่ระบุ โดยปกติตัวเปรียบเทียบจะเรียงจากน้อยไปมากดังนั้นสิ่งนี้จะเปลี่ยนลำดับเป็นมากไปหาน้อย


1
มันทำงานได้อย่างสมบูรณ์แบบกับ Objects แต่ไม่ได้มีพื้นฐาน สำหรับการเรียงลำดับดั้งเดิม int คุณควรเรียงลำดับ ASC แล้วย้อนคำตอบ
รัสเซลเอสเค

5

สำหรับอาเรย์ซึ่งมีองค์ประกอบของพริมิทีฟถ้ามีorg.apache.commons.lang(3)วิธีกำจัดอย่างง่าย ๆ ในการย้อนกลับอาเรย์ (หลังจากเรียงลำดับ) จะใช้:

ArrayUtils.reverse(array);

1
เหตุใดจึงต้องจัดเรียงลำดับแรกจากน้อยไปหามากจากนั้นใช้ไลบรารีภายนอกเพื่อย้อนกลับคำสั่งนี้เมื่อสามารถทำได้ในขั้นตอนเดียว
Betlista

และนั่นเป็นขั้นตอนเดียว?
Josip Maslac

5
ใช่ แต่ (ตามที่ระบุไว้ในความเห็นต่อคำตอบเหล่านั้น) ที่ไม่ทำงานสำหรับคำพื้นฐานที่ฉันตอบ แน่นอนว่าคำตอบของฉันไม่ใช่คำตอบที่ดีที่สุด แต่ฉันพบว่ามันเป็นไปตามเกณฑ์ของการ "ง่าย" ซึ่งผู้เขียนต้นฉบับเน้นย้ำคือ Arrays.sort(primitives); ArrayUtils.reverse(primitives);
Josip Maslac

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

อีกวิธีคือถ้าคุณใช้อินเทอร์เฟซที่เปรียบเทียบได้คุณสามารถสลับค่าเอาต์พุตที่คุณได้ระบุไว้ใน comparTo ของคุณ (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;
}

ที่ขนาดเป็นคุณลักษณะที่มีประเภทข้อมูลสองครั้งในโปรแกรมของฉัน นี่เป็นการเรียงลำดับความถี่ของคลาสที่ฉันกำหนดในลำดับย้อนกลับตามขนาดของมัน ดังนั้นเพื่อที่จะแก้ไขให้ถูกต้องว่าคุณเปลี่ยนค่าส่งกลับโดยและ< >สิ่งนี้ทำให้คุณมีสิ่งต่อไปนี้:

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

ในการใช้การเปรียบเทียบนี้เราเพียงแค่เรียกArrays.sort(mFreq)สิ่งที่จะให้คุณเรียงลำดับfreq [] mFreqที่จะให้คุณแถวเรียง

ความงาม (ในความคิดของฉัน) ของการแก้ปัญหานี้คือมันสามารถใช้ในการเรียงลำดับชั้นเรียนที่ผู้ใช้กำหนดและยิ่งกว่านั้นเรียงลำดับตามคุณลักษณะเฉพาะ หากการใช้อินเทอร์เฟซที่เปรียบเทียบนั้นฟังดูเป็นอันตรายต่อคุณฉันขอแนะนำให้คุณไม่คิดอย่างนั้นจริง ๆ แล้วไม่ใช่ ลิงค์นี้เกี่ยวกับวิธีการใช้งานสิ่งที่เทียบเคียงได้ทำให้ฉันง่ายขึ้นมาก ผู้ที่หวังว่าจะสามารถใช้ประโยชน์จากโซลูชันนี้ได้และความสุขของคุณจะเทียบเท่ากับของฉัน



0

ฉันรู้ว่านี่เป็นเธรดที่ค่อนข้างเก่า แต่นี่เป็นเวอร์ชั่นที่อัปเดตสำหรับ Integers และ Java 8:

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

โปรดทราบว่ามันคือ "o1 - o2" สำหรับการเรียงลำดับปกติ (หรือ Comparator.comparingInt ())

นอกจากนี้ยังสามารถใช้ได้กับวัตถุประเภทอื่น ๆ พูด:

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

1
ใช้งานได้กับอาร์เรย์ชนิดอ้างอิงเท่านั้นไม่ใช่อาร์เรย์ของชนิดดั้งเดิม
kimbaudi

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 ตามลำดับจากมากไปหาน้อยคุณสามารถใช้มันเพื่อเรียงลำดับอาร์เรย์ของชนิดอื่น ๆ (เช่น int, float และอื่น ๆ ) เพียงแค่เปลี่ยน "return type", "อาร์กิวเมนต์ type" และ ตัวแปร "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");

หากต้องการพิมพ์รายการตามลำดับ "ธรรมชาติ" คุณสามารถใช้วิธีการเรียง () (หรือปล่อยให้มันออกมาและได้ผลลัพธ์เหมือนกัน):

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

หรือเพื่อพิมพ์ตามลำดับจากมากไปน้อย (ย้อนกลับ) คุณสามารถใช้วิธีการเรียงลำดับที่ใช้ตัวเปรียบเทียบและย้อนกลับลำดับ:

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

หมายเหตุสิ่งนี้ต้องการให้คอลเลกชันนั้นมีการใช้งาน Comparable (เช่น Integer, String, ฯลฯ )


0

มีระเบียบจำนวนมากเกิดขึ้นที่นี่ - ผู้คนแนะนำวิธีแก้ปัญหาสำหรับค่าที่ไม่ใช่แบบดั้งเดิมพยายามใช้ algos การเรียงลำดับบางอย่างจากพื้นดินให้วิธีแก้ไขปัญหาเกี่ยวกับห้องสมุดเพิ่มเติม / 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;
}

0

เป็นเรื่องที่ดีบางครั้งเราฝึกฝนตัวอย่างเช่นนี่คือแบบเต็ม:

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

รวบรวมมัน ...

javac sortdec.java

เรียกมันว่า ...

java sortdesc

เอาท์พุท

Int Array Elements in reverse order:
30
16
15
9
2
String Array Elements in reverse order:
PP
OO
FF
DD
AA

หากคุณต้องการลองอาร์เรย์ตัวอักษรและตัวเลข ...

//replace this line:
String[] stringArray=new String[]{"FF","PP","AA","OO","DD"};

//with this:
String[] stringArray=new String[]{"10FF","20AA","50AA"};

คุณจะได้รับผลลัพธ์ดังนี้:

50AA
20AA
10FF

แหล่ง


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