java 兩種比較器的詳細介紹及例項
他們都是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發幣。首先就是註冊個海外公司做為發幣的主體,大部分專案方是註冊的新加坡非盈利基金會。註冊基金會需要你提供兩個東西。第一、