首頁 > Java > java教程 > 主體

Comparable與Comparator的比較與使用

零下一度
發布: 2017-07-24 10:19:14
原創
1313 人瀏覽過

一概述

1.Comparable與Comparator使用背景

數值型資料(byte int short long float double)天生可比較大小,可排序,String實作了Comparable介面也可以比較大小與排序,而自訂類別多種多樣,沒有一個共有的可以用作排序的指標,因此需要在自訂類別中手動建立對比的方法,出於這個目的,java提供了兩個介面Comparable與Comparator。

2.集合排序

Collections.sort()底層排序依靠的是Arrays.sort(),而Arrays.sort()排序時採用的是冒泡法。

二Comparable

需要對比大小的物件可以實作Comparable接口,實作其中的抽象方法,該抽象方法用來設定比較的方式。以下以範例進行說明:

1.實體類別

package com.javase.collections.comparable;public class Student implements Comparable<Student> {private String name;private int score;public Student() {super();
    }public Student(String name, int score) {super();this.name = name;this.score = score;
    }public String getName() {return name;
    }public void setName(String name) {this.name = name;
    }public int getScore() {return score;
    }public void setScore(int score) {this.score = score;
    }

    @Overridepublic int compareTo(Student stu) {return this.score - stu.score;// 操作对象减去参数对象,升序排列,反之降序。    }

}
登入後複製

在compareTo()方法中,以屬性score為排序指標,採用“this.score-stu.score”,最終結果以升序排列,反之降序。

2.測試類別

package com.javase.collections.comparable;import java.util.ArrayList;import java.util.Collections;import java.util.List;import org.junit.Test;public class ComparableTest {

    @Testpublic void testComparable() {
        List<Student> stus = new ArrayList<Student>();
        Student zhangsan = new Student("zhangsan", 100);
        Student lisi = new Student("lisi", 90);
        Student wanger = new Student("wanger", 95);
        stus.add(zhangsan);
        stus.add(lisi);
        stus.add(wanger);
        System.out.println("排序前");for (Student x : stus) {
            System.out.println(x.getName() + "::" + x.getScore());
        }
        System.out.println("排序后");
        Collections.sort(stus);for (Student x : stus) {
            System.out.println(x.getName() + "::" + x.getScore());
        }
    }

}
登入後複製

#輸出:

##三Comparator

如果一個類別在建立時未實作Comparable接口,希望在不修改源碼的情況下對其對象進行排序,可以在呼叫排序方法時實作Comparator比較器接口,指定排序方法。以下以範例進行說明:

1.實體類別

package com.javase.collections.comparator;public class Student {private String name;private int score;public Student() {super();
    }public Student(String name, int score) {super();this.name = name;this.score = score;
    }public String getName() {return name;
    }public void setName(String name) {this.name = name;
    }public int getScore() {return score;
    }public void setScore(int score) {this.score = score;
    }

}
登入後複製

2.測試類別

package com.javase.collections.comparator;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import org.junit.Test;public class ComparatorTest {

    @Testpublic void test() {
        List<Student> stus = new ArrayList<Student>();
        Student zhangsan = new Student("zhangsan", 100);
        Student lisi = new Student("lisi", 90);
        Student wanger = new Student("wanger", 95);
        stus.add(zhangsan);
        stus.add(lisi);
        stus.add(wanger);
        System.out.println("排序前");for (Student x : stus) {
            System.out.println(x.getName() + "::" + x.getScore());
        }
        System.out.println("-----------------------");
        Collections.sort(stus, new Comparator<Student>() {
            @Overridepublic int compare(Student stu01, Student stu02) {// return stu01.getScore() - stu02.getScore();//升序return stu02.getScore() - stu01.getScore();// 降序            }
        });

        System.out.println("排序后");for (Student x : stus) {
            System.out.println(x.getName() + "::" + x.getScore());
        }
    }

}
登入後複製

在compare(Student stu01, Student stu02)方法中,以屬性score為排序指標,採用“stu01.score-stu02.score”,最終結果升序排列,反之降序。

輸出:

 

以上是Comparable與Comparator的比較與使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板