1. 程式人生 > >java 兩種比較器的詳細介紹及例項

java 兩種比較器的詳細介紹及例項

1. Comparator 和 Comparable 相同的地方

他們都是java的一個介面, 並且是用來對自定義的class比較大小的,

什麼是自定義class: 如 public class Person{ String name; int age }.

當我們有這麼一個personList,裡面包含了person1, person2, persion3....., 我們用Collections.sort( personList ),
是得不到預期的結果的. 這時肯定有人要問, 那為什麼可以排序一個字串list呢:

如 StringList{"hello1" , "hello3" , "hello2"}, Collections.sort( stringList ) 能夠得到正確的排序, 那是因為
String 這個物件已經幫我們實現了 Comparable介面 , 所以我們的 Person 如果想排序, 也要實現一個比較器。

2. Comparator 和 Comparable 的區別

Comparable

Comparable 定義在 Person類的內部:

public class Persion implements Comparable {..比較Person的大小..},

因為已經實現了比較器,那麼我們的Person現在是一個可以比較大小的物件了,它的比較功能和String完全一樣,可以隨時隨地的拿來
比較大小,因為Person現在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結果。

Comparator

Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化,如

public class Person{ String name; int age },

然後我們另外定義一個比較器:

public PersonComparator implements Comparator() {..比較Person的大小..},

在PersonComparator裡面實現了怎麼比較兩個Person的大小. 所以,用這種方法,當我們要對一個 personList進行排序的時候,
我們除了了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因為怎麼比較Person的大小是在PersonComparator
裡面實現的, 如:

Collections.sort( personList , new PersonComparator() ).

例項:

package com.kk.Collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CompareTest {
    public static void main(String[] args) {
        List<Student> list=new ArrayList<Student>(10);
        list.add(new Student(1,"jj"));
        list.add(new Student(0,"ww"));
        list.add(new Student(0,"kk"));
        list.add(new Student(2,"ll"));
        Collections.sort(list); //內部比較器:要排序的物件實現Comparable介面,可以對自身進行比較
        System.out.println(list);
        
        List<Teacher> t=new ArrayList<Teacher>(10);
        t.add(new Teacher(1,12));
        t.add(new Teacher(0,13));
        t.add(new Teacher(0,14));
        t.add(new Teacher(2,15));
        Collections.sort(t,new StudentComparator()); //外部比較器:通過實現Comparator介面
        System.out.println(t);
    }
}

class Student implements Comparable {
    int num;

    String name;

    public Student(int num, String name) {
        this.num = num;
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "\r\tnum:"+num+" name:"+name+"\r";
    }

    public int compareTo(Object o) {
        Student tmp=(Student) o;
        int result=tmp.num>num?1:(tmp.num==num?0:-1);
        if (result==0) {
            result=tmp.name.indexOf(0)>name.indexOf(0)?1:-1;
        }
        return result;
    }
}

class Teacher{
    int num;

    double salary;
    
    public Teacher(int num, double salary) {
        this.num = num;
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "\r\tnum:"+num+" salary:"+salary+"\r";
    }    
}

class StudentComparator implements Comparator{

    public int compare(Object o1, Object o2) {
        Teacher t1=(Teacher) o1;
        Teacher t2=(Teacher) o2;
        int result=t1.num>t2.num?1:(t1.num==t2.num?0:-1);
        return result=result==0?(t1.salary<t2.salary?1:-1):result;
    }
    
}


相關推薦

java 比較詳細介紹例項

1. Comparator 和 Comparable 相同的地方 他們都是java的一個介面, 並且是用來對自定義的class比較大小的, 什麼是自定義class: 如 public class Person{ String name; int age }. 當我們有這麼一

Java比較的實現

程式輸出結果:  為了讓大家較全,我把結果拷貝下來,如下:  通過內部比較器實現:  [id:1,salary=4500.0, id:2,salary=5000.0, id:4,salary=3500.0, id:4,salary=4000.0, id:5,salary=3000.0]  通過外部比較器實現:

java定時

etl 兩種 des cal 固定 指定 let num content 第一種:循環執行的程序 import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.Exec

scalar中的基於Ordered和Ordering比較

1>Ordered class PP(var name: String, var age: Int) extends Ordered[PP] { override def compare(that: PP) = if (this.age > that.age) -1 else if (

JAVA_比較的區別

不同之處: 1 排序規則實現的方法不同     Comparable介面的方法:compareTo(Object o)     Comparator介面的方法:compare(T o1, To2) 2 類設計前後不同 Comparable介面用於在類的設計中使用;

js中定時的設定清除

1、JS中的定時器有兩種: window.setTimeout([function],[interval]) 設定一個定時器,並且設定了一個等待的時間[interval],當到達時間後,執行對應的方法[function],當方法執行完成定時器停止(但是定時器還在,只不過沒用了

Java中四引用強 軟 弱 虛 的詳細介紹理解

 Java中強軟弱虛四種引用 一:引用的目的: 在Java中垃圾回收器的執行是JVM操作的,但是我們仍然可以在一定程度上與垃圾回收器進行互動,其目的在於更好的幫助垃圾回收器管理好應用的記憶體,避免記憶

java定時類Timer和多執行緒介紹例項

任務要求: 完成一個java application應用程式,使用定時器程式設計,在實時顯示當前時間,每1秒時鐘內容更新一次。 完成一個java application應用程式,在應用程式主程序中新開一個執行緒,此執行緒進行死迴圈,每1秒被啟用一次,啟用時即在

java求圖形的面積(比較

用java求圖形的面積 第一種(單次輸入): import java.util.Scanner; //練習一求圖形的面積 public class TestArea { public static void main(String[] args) {

FPGA寄存的使能

合成 png 一個數 輸入 連續 電路 center nbsp 非阻塞 在FPGA中,寄存器的使能設計一般有兩種方式: 1.直接使用寄存器的使能端口。 2.使用一個數據選擇器連接寄存器的D端口,通過數據選擇器的sel端口做使能。如下圖 這個方式與

另一比較:Comparator

span 問題 com pre log implement nts face spa package comparatordemo.cn; import java.util.Comparator; /* * 一個對象的初期,並沒有實現comparable 接口,此時

轉---CentOS安裝Oracle數據庫詳細介紹常見問題匯總

cati res export 硬件 image centos 6 bin pre 數據庫安裝 一、安裝前準備 1.軟件硬件要求 操作系統:CentOS 6.4(32bit)Oracle數據庫版本:Oracle 10g(10201_database_linux32.zi

linux安裝系統分區詳細介紹常用ls命令

自動分區 fff 英語基礎 沒有 擁有 inux 文件夾 swap user linux對於沒有基礎的初學者來說,最難的就是第一步,不為什麽因為萬事開頭難,第一步就是裝系統分區,而這裏面最難的我認為就是分區部分,如果是讓系統自動分區那就很簡單,但對於初學者一般都是要手動分區

CentOS 6.9配置網卡IP/網關/DNS命令詳細介紹一些常用網絡配置命令(轉)

linux. centos fly fig details oba routing href 修改dns 一、IP 即時生效(重啟後失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 r

Oracle 11g服務詳細介紹哪些服務是必須開啟的?

系統 創建 span rac div 哪些 能夠 對象 sql*plus 按照windows 7 64位 安裝oracle 11g R2中的方法成功安裝Oracle 11g後,共有7個服務,這七個服務的含義分別為: 1. Oracle ORCL VSS Writer Se

Oracle 11g服務詳細介紹必須開啟的服務

home 映射 遠程訪問 cover AC 管理器 ise 默認 影響 按照windows 7 64位 安裝oracle 11g R2中的方法成功安裝Oracle 11g後,共有7個服務,這七個服務的含義分別為: 1. Oracle ORCL VSS Writer Serv

Java 集合系列: ArrayList詳細介紹(源碼解析)和使用示例

java 集合 概要 上一章,我們學習了Collection的架構。這一章開始,我們對Collection的具體實現類進行講解;首先,講解List,而List中ArrayList又最為常用。因此,本章我們講解ArrayList。先對ArrayList有個整體認識,再學習它的源碼,最後再通過例子來學習如

Java 實現多線程的區別

的區別 runnable ticket 解決 sys system ava div [] 1,繼承 Thread(各自賣10張票) class MyThread extends Thread{ private int ticket = 10; public

js中定時setTimeout和setInterval定時

專案中,經常會用到定時器來實現資料實時更新、時間等,簡單總結一下: Javascript中的定時器有兩種,setInterval和setTimeout,而定時器的作用就是延遲執行。 一、定時器的寫法 setInterval(expression,milliseconds);

區塊鏈ICO發幣的全部流程詳細介紹費用問題

區塊鏈ico發幣在我國已經被禁止了,但是仍然有很多人在從事區塊鏈創業工作。並且隨著市場的越來越成熟,趨於穩定的常態下。更多的人看到了在區塊鏈創業的可能。下面就來詳細說一下怎麼進行區塊鏈ico發幣。首先就是註冊個海外公司做為發幣的主體,大部分專案方是註冊的新加坡非盈利基金會。註冊基金會需要你提供兩個東西。第一、