簡體   English   中英

使用Comparator實現對象ArrayList的快速排序

[英]Implementation of Quick Sort for ArrayList of Object using Comparator

我有一類學生

public Student(int ID, String firstName, String lastName, int mark) {
        this.ID = ID;
        this.firstName = firstName;
        this.lastName = lastName;
        this.mark = mark;
    }

我創建了一個 Student ArrayList,我需要使用 Comparator 將它們按升序排序,並具有多個屬性。

 public static Comparator<Student> StuNameComparator = new Comparator<Student>() {

    public int compare(Student s1, Student s2) {
       String StudentName1 = s1.getFirstName().toUpperCase();
       String StudentName2 = s2.getFirstName().toUpperCase();
       return StudentName1.compareTo(StudentName2);
    }
};



 public static Comparator<Student> StudentID = new Comparator<Student>() {

    public int compare(Student s1, Student s2) {

       int id1 = s1.getID();
       int id2 = s2.getID();
       return id1-id2;
   }};

我知道,我可以輕松使用

Collections.sort(arraylist, Student.StuNameComparator);

但這里有一個問題,我需要使用 Quicksort 進行排序,對於集合,使用的排序是 MergeSort。 我知道 MergeSort 更好,因為它很穩定並且沒有 n^2 作為最壞的情況,但我需要實現快速排序

這是快速排序的初稿,我需要更改參數的類型但是如何使用快速排序,在需要時按 ID 和在需要時按 firstName 對它們進行排序?

    int middle = (int) Math.ceil((double)input.size() / 2);
    int pivot = input.get(middle);

    for (int i = 0; i < input.size(); i++) {
        if(input.get(i) <= pivot){
        ///somecode
    }

您快到了。 您唯一需要替換的是<=運算符的使用(這僅適用於可以使用Comparable接口將Integer打包為int的情況:

if (input.get(i).compareTo(pivot) <= 0) {

您需要在參數中添加一個比較器並更改為學生列表: public List<Student> quicksort(List<Student> input, Comparator<Student> comparator) if(input.get(i) <= pivot){ public List<Student> quicksort(List<Student> input, Comparator<Student> comparator)然后更改您的if(input.get(i) <= pivot){if(comparator.compare(input.get(i),pivot) <= 0){

當然,pivot 現在是Student pivot = input.get(middle); List<student>越來越少。 你現在只需要將你想要的比較器傳遞給方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM