จะเรียง ArrayList <Long> ในลำดับที่ลดลงได้อย่างไร?


คำตอบ:


241

นี่เป็นวิธีหนึ่งสำหรับคุณlist:

list.sort(null);
Collections.reverse(list);

หรือคุณสามารถใช้ของคุณเองComparatorเพื่อจัดเรียงและกำจัดขั้นตอนย้อนกลับ:

list.sort((o1, o2) -> o2.compareTo(o1));

หรือใช้งานง่ายกว่าCollections.reverseOrder()นั้นเนื่องจากคุณกำลังย้อนกลับเท่านั้น:

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1รหัสนี้ไร้สาระ ใช้o1.compareTo(o2)แล้ว
ilalex

4
@ilya: โอ้ใช่จุดที่ดีแม้ว่ามันจะต้องอยู่o2.compareTo(o1)ที่นี่ :)
WhiteFang34

2
list.sort (Collections.reverseOrder ());
tunix

ยกนิ้วให้list.sort((o1, o2) -> o2.compareTo(o1))
arenaq


18

คุณสามารถใช้รหัสต่อไปนี้ซึ่งระบุไว้ด้านล่าง

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

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

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

โดยที่ CustomComparator เป็นคลาสตัวเปรียบเทียบที่เปรียบเทียบอ็อบเจ็กต์ที่มีอยู่ในรายการ


10

จาวา 8

การทำสิ่งนี้ใน java 8 นั้นสนุกและง่ายขึ้นมาก

Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);

แลมด้าสำนวนร็อคที่นี่ !!!

ในกรณีที่คุณต้องการตรรกะมากกว่าหนึ่งบรรทัดในการเปรียบเทียบaและbคุณสามารถเขียนแบบนี้ได้

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});

2
ฉันคิดว่าถ้าเราเปลี่ยนสิ่งนี้เป็น b.compareTo (a) เราไม่จำเป็นต้องย้อนกลับคอลเล็กชัน
zawhtut

@zawhtut จริงทั้งหมด! เพิ่งกล่าวถึง reverse () เพื่อให้คุณรู้ว่าตัวเลือกนั้นเป็นของคุณ
azerafati

1
คุณต้องแปลง long เป็น Long หรือไม่?
BluE


3

สำหรับ lamdas ที่ค่า long ของคุณอยู่ที่ไหนสักแห่งในวัตถุฉันแนะนำให้ใช้:

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

หรือดีกว่า:

.sorted(Comparator.comparingLong(MyObject::getLong))


2

โดยใช้Collections.sort()กับตัวเปรียบเทียบที่ให้ลำดับที่ลดลง ดู Javadoc สำหรับCollections.sort


2

แนวทางทั่วไปในการใช้งานตัวเปรียบเทียบของเราเองดังต่อไปนี้

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });

1

วิธีการต่อไปนี้จะจัดเรียงรายการตามลำดับจากมากไปหาน้อยและยังจัดการกับค่า ' null ' ในกรณีที่คุณมีค่า null Collections.sort ()จะโยนNullPointerException

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });

0

คุณยังสามารถเรียงลำดับArrayListด้วย a TreeSetแทนไฟล์comparator. นี่คือตัวอย่างจากคำถามที่ฉันเคยมีมาก่อนสำหรับอาร์เรย์จำนวนเต็ม ฉันใช้ "numbers" เป็นชื่อตัวยึดสำหรับไฟล์ArrayList.


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}

แต่TreeSetไม่เก็บค่าที่ซ้ำกัน

0

ดังนั้นมีบางอย่างที่ฉันอยากจะนำเสนอซึ่งฉันคิดว่าสำคัญและฉันคิดว่าคุณควรพิจารณา รันไทม์และหน่วยความจำ สมมติว่าคุณมีรายการและต้องการจัดเรียงคุณสามารถทำได้มีการจัดเรียงในตัวหรือคุณสามารถพัฒนาของคุณเอง แล้วคุณบอกว่าต้องการย้อนกลับรายการ นั่นคือคำตอบที่ระบุไว้ข้างต้น

หากคุณกำลังสร้างรายการนั้นอาจเป็นการดีที่จะใช้โครงสร้างข้อมูลที่แตกต่างกันเพื่อจัดเก็บจากนั้นจึงถ่ายโอนข้อมูลลงในอาร์เรย์

กองทำเพียงแค่นี้ คุณกรองข้อมูลและจะจัดการทุกอย่างจากนั้นคุณสามารถดึงข้อมูลทุกอย่างออกจากวัตถุและจะถูกจัดเรียง

อีกทางเลือกหนึ่งคือการทำความเข้าใจว่าแผนที่ทำงานอย่างไร หลายครั้งแผนที่หรือ HashMap เป็นสิ่งที่เรียกว่ามีแนวคิดพื้นฐานอยู่เบื้องหลัง

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

ขึ้นอยู่กับว่าคุณประมวลผลข้อมูลอย่างไรก่อนที่ฉันคิดว่าคุณควรดำเนินการเรียงลำดับต่อไปและการกลับรายการในภายหลัง


0

วิธีการเปรียบเทียบของผู้เปรียบเทียบสามารถใช้เพื่อเปรียบเทียบวัตถุจากนั้นreversed()สามารถใช้วิธีการเพื่อย้อนกลับลำดับ -

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.