1. 程式人生 > >Comparable與Comparator的升序與降序

Comparable與Comparator的升序與降序

Comparable介面

public interface Comparable<T> {
    int compareTo(T other);
}

當呼叫x.compareTo(y)時,根據返回的整數值來確定x與y的位置,當返回值為正整數時,x在y後面。可以這樣理解——x與y比較,正數大於0,說明x比y大,所以x要排在y後面。同理,當返回值為負數時,x在y前面。當返回值為0,x和y相等。

當我們實現Comparable介面,重寫compareTo方法時,會遇到這種情況

public class Person implements Comparable {
    private int age;
    private String name;

    public Person(int age, String name){
        super();
        this.age = age;
        this.name = name;
    }

    public int compareTo(Person p){
        this.age - p.getAge();
    }

    //省略了getter和setter
}
public class PersonTest {
    public static void main(String[] args) {
        List<Person> persons = getPersons();
        System.out.println("unsorted List");
        for(Person p : persons){
            System.out.println(p.getAge());
        }
        System.out.println("sorted List");
        Collections.sort(persons);
        for(Person p : persons){
            System.out.println(p.getAge());
        }
    }

    private static List<Person> getPersons() {
		List<Person> persons = new LinkedList<Person>();
		Person p1 = new Person(23, "Bob");
		Person p2 = new Person(27, "Tom");
		Person p3 = new Person(25, "Jerry");
		Person p4 = new Person(21, "Christine");
		persons.add(p1);
		persons.add(p2);
		persons.add(p3);
		persons.add(p4);
		return persons;
	}
}

執行上面的方法會發現,排序會為升序

從程式碼來看,沒看到返回值的正負,怎麼就為升序了。那是因為預設this.age小於p.getAge()。當我們執行this.age-p.getAge(),返回值為負整數,所以this再p前面,所以為升序。反之,如果用p.getAge()-this.age,那麼結果就為降序了。

Comparator介面

排序的時候會遇到這種情況——當對已經設計好的類(比如Person)進行排序,根據對修改關閉,對擴充套件開發的原則,我們不能修改Person類,此時只需要實現Comparator介面,重寫compare(T arg1, T arg2)方法。

同理arg1是預設小於arg2的,如果用arg1 - arg2,結果為升序。或者用arg1.compareTo(arg2),結果也為升序。

注意:T不能是基本型別,兩者相減,只是說用他們能相減的屬性相減或者是基本數值型別的包裝類相減,而不是兩個物件相減

相關推薦

資料庫sqlite查詢語句升序

注意降序dec或升序 裡面如果不是迴圈while的話,取得都是一個數據。 如果是降序,只取一個(沒有迴圈)取的是一個 最大的數; 如果是升序,只取一個(沒有迴圈)取的是一個 最小的數 SQLite Where 子句SQLite的 WHERE 子句用於指定從一個

比較器comparator,compare函式升序原始碼分析

0、前言   一直想不明白,compare函式如何通過返回值,就確定是升序還是降序呢,於是乎決定好好的先看看原始碼。   下面的程式碼實現了對自己寫的Students類按照年齡升序的排序,就是通過對實現comparator介面,重寫compare的方法,實現

iOS 陣列排序(升序&&亂)

1、陣列排序---升序 #pragma mark --- 陣列排序--升序 -(void)sortArrASCE{ NSArray *array = @[@(2),@(15),@(1),@(22)]; //sort方法排序 NSArray *result = [arr

Java的陣列和list升序,逆函式Collections.sort和Arrays.sort的使用

list升序,降序,逆序List<Integer>list =new ArrayList<Integer>();//如果list是 5 7 2 6 8 1 41、升序:Collections.sort(list) //list: 1 2 4 5 6 7 82、降序:Collection

iOS---iOS之陣列的排序(升序及亂

  NSMutableArray *priceArray = [NSMutableArray arrayWithObjects:@"0.2",@"5",@"44",@"67",@"98.5",@"1.55", nil]; [priceArray sortUsingComparato

Java中Arrays.sort()自定義陣列的升序排序

Java學習中會遇到對陣列進行升序或者降序排序的問題 Java語言提供給我們Array.sort(int [] arr)對陣列進行升序排列 import java.util.Arrays; public class Test1 { public stat

mysql 中的升序

MySQL 中  排序怎麼都記不住,這裡我把它的全拼找到 了     desc是descend 降序意思      asc 是ascend 升序意思     sql = "select 表內容名  

企業經常出的基本面試題 簡單的氣泡排序 升序

氣泡排序 } document.write(nums(mynum)); // 從小到大 function num(arr){ for(var i =0; i< arr.length;i++){ for(var j = 0;j < arr.length;j++){ if(a

MYSQL order by 根據不同條件升序

現在有一個表,欄位age和type,type = 1的時候需要age降序排列,type = 2的時候age升序排列。一開始覺得很簡單啊,於是就寫: SELECT * FROM table_a ORDER BY CASE WHEN type = 1 THEN

java 之list集合按照欄位升序

實體類我就不寫了,直接上資料吧! List<PersionInfo> list=new ArrayList<>(); PersionInfo info1=new Per

連結串列的帶引數排序,可以通過姓名、成績進行升序操作

先上效果圖: void main() { stu * pHeader = creatLink(4); //建立連結串列,需要手動輸入姓名成績 sort(pHeader, true, COMPARE_SCORE); //按

根據訂單ID進行升序排列

問題描述:訂單明細表中有訂單ID,客戶ID,運貨商,運貨費等欄位(如下表),想實現根據點選訂單ID的次數對訂單ID進行排序,比如說,點選一次訂單ID的欄位名,則根據訂單ID進行升序排列,再點選一次則降序排列,以此類推。 訂單ID   客戶ID 僱員ID 訂購

list集合中的物件按時間升序

實體類package com.suixingpay.sms.dubbo.provider; import java.util.Date; public class TestObject { private Date installDate; private

List根據實體類的某個屬性升序或者來排列

介紹 最近做的一個前臺的頁面的獲曲資料庫某個表的列表的功能,要求按照表的某個屬性來升序最好不要動mybatis,所以通過mybatis獲取的list,通過方法的 Collections.sort(list, new Comparator() {…});進行排序 升序 / 降序 i

利用Arrays.sort();方法對相應陣列進行升序排列

一.方法 Ⅰ.Arrays.sort();方法是Array類中的工具方法,使陣列中的元素進行升序排列。匯入載入java.util.Arrays;後可以直接使用。 二.升序例項 Ⅰ.舉例說明 對任意人數的學生成績進行升序排列。 Ⅱ.程式碼 ①先利用

mysql 中的升序 .

mySQL裡desc和asc的意思     desc是descend 降序意思     asc 是ascend 升序意思     sql = "select 表內容名    from   資料庫表名 Putout=true order by 讀取的排序表名 asc" 例如

氣泡排序(升序)的python程式碼實現

氣泡排序 交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。 應用交換排序基本思想的主要排序方法有:氣泡排序和快速排序。 氣泡排序的程式設計

Map按值的升序排序最簡單的方法

使用jdk8的新特性private List<Map.Entry<String, Integer>> sortMap(Map<String, Integer> map, boolean asc) { Stream<Map.E

java SortedMap 升序操作

參考: ########################################################## 降序操作:按key降序 import java.util.Comparator; import java.util.Iterator; i

SQL 升序排列

/*查詢學生表中姓名、學號,並以學號降序排序*/ select name,StuID from Students_information order by StuID desc /**order b