一個Comparable和Comparator兩個介面的使用的例子
Comparable和Comparator兩個介面的使用
這兩個介面都有自己的一個抽象的比較方法:
Comparable:int compareTo(Object o) ;
Comparator: int compare(T a, T b) ;
這個可以用idea等開發編輯器檢視原始碼,這裡的T是支援泛型
一般我們使用這兩種比較方法時,使用的是Collections工具類的sort方法:
sort(List<T> list): 基於被排序物件的compareTo()方法,要求被排序物件實現Comparable介面,並重寫compareTo()方法 sort(List<T> list,Comparator cp): 使用cp比較器對集合元素進行排序;
程式碼如下:
定義一個Student類
public class Student /*implements Comparable */{//為了能夠用Comparable來做比較,要實現Comparable
private String name;
private int age;
private float sorce;
/*
@Override
public int compareTo(Object o) {
Student stu=(Student)o;
int m=(int)((((Student) o).sorce-sorce)*100);//成績做降序排序
m = m == 0 ? (age - ((Student) o).age) : m;//成績一樣,那在成績排序的基礎上按照年齡由小到大排序
return m;
}
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Float.compare(student.sorce, sorce) == 0 &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age, sorce);
}
public Student() {
}
public Student(String name, int age, float sorce) {
this.name = name;
this.age = age;
this.sorce = sorce;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSorce() {
return sorce;
}
public void setSorce(float sorce) {
this.sorce = sorce;
}
}
測試類Demo
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/*
* Comparable和Comparator兩個介面的使用
* 分別用Comparable和Comparator兩個介面對下列四位同學的成績做降序排序
* 如果成績一樣,那在成績排序的基礎上按照年齡由小到大排序
*
* 姓名(String) 年齡(int) 分數(float)
* liusan 20 90.0F
* lisi 22 90.0F
* wangwu 20 99.0F
* sunliu 22 100.0F
* */
public class Demo {
public static void main(String[] args) {
// 學生的資訊是通過自定義的Student類的物件呼叫,初始化一下這四個學生的資訊
ArrayList<Student> stu=new ArrayList<>();
Student stu1=new Student("liusan",22,90.0f);
Student stu2=new Student("lisi",20,90.0f);
Student stu3=new Student("wangwu",20,99.0f);
Student stu4=new Student("sunliu",22,100.0f);
stu.add(stu1);stu.add(stu2);stu.add(stu3);stu.add(stu4);
//使用Comparable
/* Collections.sort(stu);
System.out.println("name\t\tage\t\tscore");
for (Student student : stu) {
System.out.println(student.getName()+"\t\t"+student.getAge()+"\t\t"+student.getSorce());
}*/
//使用Comparator
Collections.sort(stu, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int m=(int) ((o2.getSorce()-o1.getSorce())*100);//成績做降序排序
m=m==0?(o1.getAge()-o2.getAge()):m;//成績一樣,那在成績排序的基礎上按照年齡由小到大排序
return m;
}
});
//列印輸出
System.out.println("name\t\tage\t\tscore");
for (Student student : stu) {
System.out.println(student.getName()+"\t\t"+student.getAge()+"\t\t"+student.getSorce());
}
}
}
可以看出,這兩個方法的比較其實是一個作差的比較。
相關推薦
一個Comparable和Comparator兩個介面的使用的例子
Comparable和Comparator兩個介面的使用 這兩個介面都有自己的一個抽象的比較方法: Comparable:int compareTo(Object o) ; Comparator: int compare(T a, T b)
Comparable 與 Comparator 兩個介面的作用
在我的印象裡,對於陣列排序,最簡單的方法就是使用Arrays.sort(陣列a);它也使我理所應當的認為:Arrays這個類完全實現這個sort的方法,而實際上並非如此,先看下sort的原型:public static <T extends Comparable<
Map集合的遍歷方式以及TreeMap集合儲存自定義物件實現比較的Comparable和Comparator兩種方式
Map集合的特點 1、Map集合中儲存的都是鍵值對,鍵和值是一一對應的 2、一個對映不能包含重複的值 3、每個鍵最多隻能對映到一個值上 Map介面和Collection介面的不同 Map是雙列集合的根介面,Collection是單列集合的根介面 1、Map是雙列的(是雙列集合的根介
Java集合框架上機練習題:編寫一個Book類,該類至少有name和price兩個屬性。該類要實現Comparable接口,在接口的compareTo()方法.....
ext .cn 數據庫 識別 方法 屬性 set package compareto 編寫一個Book類,該類至少有name和price兩個屬性。該類要實現Comparable接口,在接口的compareTo()方法中規定兩個Book類實例的大小關系為二者的price屬性的
JAVA中Arrays.sort()使用兩種方式(Comparable和Comparator介面)對物件或者引用進行排序
package com.dt.Sort; import java.util.Arrays; import java.util.Comparator; /** * 使用Comparator介面:編寫多個排序方式類實現Comparator介面,並重寫新Comparator介面中的compare()方法 pub
Linux socket編程示例(最簡單的TCP和UDP兩個例子)
步驟 proto 詳解 dto 應該 pro sock bind ram 一、socket編程 網絡功能是Uinux/Linux的一個重要特點,有著悠久的歷史,因此有一個非常固定的編程套路。 基於TCP的網絡編程: 基於連接, 在交互過程中, 服務器
Unity中使用C#遞迴輸出陣列1,2,3,5,8,...該陣列的生成規律是每一個數字是前兩個數字的和
一、實現思路:第一個數大於等於0,第二個數大於等於第一個數,最後指定一個需要輸出的最後一個數字(該數字用作最後輸出的界限) ①實現指令碼如下: /*** * Title:"XXX" 專案 * 主題:XXX * Description: * 功能:XXX * Date:2018 * Ver
Comparable和Comparator介面比較
Java提供了只包含一個compareTo()方法的Comparable介面。這個方法可以個給兩個物件排序。具體來說,它返回負數,0,正數來表明已經存在的物件小於,等於,大於輸入物件。 Java提供了包含compare()和equals()兩個方法的Comparator介面。compare()方
java--Fibonacc由數字1、1、2、3...組成的,從第三個數字起每一個數字為前兩個數字的和。建立一個方法,接受一個整數引數,顯示從第一個元素開始總共由該引數指定的個數所構成的所有斐波那契數
題目完整描述:一個斐波那契數列是由數字1、1、2、3、5、8、13、21、34等等組成的,其中每一個數字(從第三個數字起)都是前兩個數字的和。建立一個方法,接受一個整數引數,並顯示從第一個元素開始總共由該引數指定的個數所構成的所有斐波那契數字。例如,如果執行 java Fibonacci 5(Fib
如何用兩個棧模擬實現一個佇列? 如果這兩個堆疊的容量分別是m和n(m>n),你的方法能保證佇列的最大容量是多少?
保證入隊完畢之後才可以出隊; 分析:棧的特點是“後進先出(LIFO)”,而佇列的特點是“先進先出(FIFO)”。用兩個棧模擬實現一個佇列的基本思路是:用一個棧作為儲存空間,另一個棧作為輸出緩衝區,入隊時把元素按順序壓入兩棧模擬的佇列,出隊時按入隊的順序出棧即可。 如下圖,用容
Comparable 和 Comparator 介面的比較
背景 Comparable equals compareTo Comparator
Comparable 和Comparator介面
Comparable 是提供一定排序的介面,而Comparator介面通過我們的自定義來比較。 所以Comparable希望提供自然順序的類,介面中的一個方法 int compareTo(object o)比較當前物件,在物件之後返回正值; 而Comparato
判斷子串和判斷兩個字串是否由另一個旋轉而來的問題
題目:假定又一個IsSubString,可檢查一個單詞是否為其他字串的子串。給定兩個字串s1和s2,請編寫程式碼檢查s2是否為s1旋轉而成,要求只能呼叫一次IsSubString。(比如,waterb
微信獲取使用者資訊的兩個介面和兩個ACCESS_TOKEN
有一段時間沒有搞微信開發了 ,今天突然要改一下程式! 回頭一看 微信的幫助文件太tm的稀爛的,太難懂了,這做個筆記以後看著方便 微信有2個ACCESS_TOKEN, 1,基礎介面的token 獲取介面是 https://api.weixin.qq.com/cgi-bin/token?gran
qt-一個類連線兩個介面
在實際開發中,肯定不會是一個介面寫到死,都是會新新增一些介面來使用, 昨天弄了一下,如果不是通過一個介面工程來建立一整套class+ui的話,在一個class中呼叫別的ui還是很麻煩的, 首先我們建立一個介面。 建立新建檔案->qt->Qt d
Java Comparable排序介面和Comparator比較器介面
實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List列表(或陣列)可以通過 Collections.so
1.建立一個Rectangle類,新增width和height兩個成員變數。 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 3.程式設計利用Rectangle輸出一個矩形的周
/* * 1.建立一個Rectangle類,新增width和height兩個成員變數。 * 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 * 3.程式設計利用Rectangle輸出一個矩形的周長和麵積 */ public class ke1 {//
用兩個棧實現佇列和用兩個佇列實現一個棧
題目:用兩個棧實現一個佇列。佇列的生命如下,請實現它的兩個函式appendTail和deleteHead,分別完成在佇列尾部插入結點和在佇列頭部刪除結點的功能。 template <typename T>class CQueue { public: C
Java中Comparable和Comparator介面區別分析
Comparable 簡介 Comparable 是排序介面。 若一個類實現了Comparable介面,就意味著“該類支援排序”。 即然實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List
.建立一個Rectangle類,新增width和height兩個成員變數。 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 3.程式設計利用Rectangle輸出一個矩形的周
/* * 1.建立一個Rectangle類,新增width和height兩個成員變數。 * 2.在Rectangle中新增兩種方法分別計算矩形的周長和麵積 * 3.程式設計利用Rectangle輸出一個矩形的周長和麵積 */public class Rectangle {/