日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TreeSet集合中的自定义比较器

發布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TreeSet集合中的自定义比较器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


import java.util.Comparator;
import java.util.TreeSet;
/*
?當treeset集合中的元素不具備比較功能,或者具備的比較功能不是所需要的
?例如person對象中的自然排序是按照年齡進行排序的,但現在的需求是按照姓名進行排序,改源代碼的方式不可取
?
?該如果解決這個問題呢?
?既然元素具備的比較方式不滿足應用,這時可以讓集合自身具備比較性,需要集合一初始化就具備比較功能,因為要在
?添加元素前具備,就要在構造函數中進行初始化
?
?只要將一個實現了comparator接口的子類對象作為參數傳遞給treeset集合的構造函數即可,這樣該集合就具備了比較功能
?
?treeset排序方式有兩種
?第一種:讓元素自身具備比較功能,其實就是讓元素實現Comparable接口,覆蓋compareTo方法,這稱為元素的自然排序
?第二種:當元素自身不具備比較性,或者具備的比較性不是所需要的,這時可以讓集合自身具備比較性
???定義一個比較器,其實就是定義一個類,實現Comparator接口,覆蓋compare方法
???經Comparator接口的子類對象作為參數傳遞給treeset集合的構造函數
???
???當元素具備比較性,同時集合具有比較器時,以比較器為主
???
?建議使用第二種排序方式
?
?一般在描述一個對象時,如果該對象封裝了具體的數據,會出現很多這樣的對象,比如:員工,學生對象
?這時就需要進行容器的存儲,那么描述該類對象時,就一定要復寫幾個方法:
?1.hashcode()
?2.equals()
?3.toString()
?4.最好實現Comparable接口,讓該類實現自然排序功能
?
?建立對象自身判斷是否相同的依據,同時讓對象具備基本的比較性*/
public class TreeSetDemo{

?/**
? * @param args
? */
?public static void main(String[] args) {
??// TODO Auto-generated method stub
??TreeSet ts=new TreeSet(new CompareByName());
??ts.add(new Person("lisi3",20));
??ts.add(new Person("lisi4",21));
??ts.add(new Person("lisi6",29));
??ts.add(new Person("lisi9",23));
??ts.add(new Person("lisi1",25));
??
??System.out.println(ts);
?}

}
//自定義一個比較器
class CompareByName implements Comparator
{
?public int compare(Object o1,Object o2)
?{
??Person p1=(Person)o1;
??Person p2=(Person)o2;
??
??int num=p1.getName().compareTo(p2.getName());
??return num==0? p1.getAge()-p2.getAge():num;
?}
}
class Person implements Comparable
{
?String name;
?int age;
?Person(String name,int age)
?{
??this.name=name;
??this.age=age;
?}
?//人的自然排序是按照年齡進行排序
?public int compareTo(Object obj)
?{
??Person p=(Person)obj;
??//int num=this.age-p.age;
??int num=new Integer(this.age).compareTo(new Integer(p.age));
??return num==0? this.name.compareTo(p.name):num;
??/*if(this.age>p.age)
???return 1;
??else if(this.age<p.age)
???return -1;
??else
???return 0;*/
?}
?public int hashCode()
?{
??//System.out.println(this+".....hashCode");
??final int NUMBER=39;
??return name.hashCode()+age*NUMBER;
?}/**/
?public boolean equals(Object obj)
?{
??//System.out.println(this+"....equals...."+obj);
??if(this==obj)
???return true;
??if(!(obj instanceof Person))
???return false;
??Person p=(Person)obj;
??return this.name.equals(p.name) && this.age==p.age;
?}
?public String getName()
?{
??return name;
?}
?public int getAge()
?{
??return age;
?}
?public String toString()
?{
??return name+"::"+age;
?}
?
}

run:

[lisi1::25, lisi3::20, lisi4::21, lisi6::29, lisi9::23]

?

?

?

?

?

?

?


?

轉載于:https://blog.51cto.com/asalinux/645740

總結

以上是生活随笔為你收集整理的TreeSet集合中的自定义比较器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。