日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

TreeSet集合中的自定义比较器

發(fā)布時(shí)間:2023/12/9 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TreeSet集合中的自定义比较器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


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

}
//自定義一個(gè)比較器
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;
?}
?//人的自然排序是按照年齡進(jìn)行排序
?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]

?

?

?

?

?

?

?


?

轉(zhuǎn)載于:https://blog.51cto.com/asalinux/645740

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。