TreeSet(对象排序功能)和自定义比较器

排序功能:

package com.mth.test;

class Person implements Comparable<Person> {
    // 实现Comparable接口的目的,在于建立Person对象的自然顺序
    public int compareTo(Person p) {
	// 方法中就是Person的自然顺序
	// 对类中的成员变量,进行自然顺序比较
	// this 小 结果是负数 两个一样 是0 this 大就是正数
	int num = this.name.compareTo(p.name);
	return num == 0 ? this.age - p.age : num;
    }

    private String name;
    private int age;

    Person(String name, int age) {
	this.name = name;
	this.age = age;
    }

    public String getName() {
	return name;
    }

    public int getAge() {
	return age;
    }

    public String toString() {
	return this.name + "..." + this.age;
    }

    public int hashCode() {
	// 覆盖的依据,就是对象中的成员变量 name age
	// 姓名 和年龄一样的对象,具有同样的hashCode
	// lisi 22 100 + 22*2 = 144(122)
	// wangwu 25 97 + 25*2 = 147(122)
	// 乘以2降低,姓名年龄不一致,恰巧计算出了相同的哈希值的问题 //如果对象的哈希值一样,Set集合比较equals
	final int X = 2;
	return this.name.hashCode() + this.age * X;
    }

    public boolean equals(Object obj) {
	if (obj == null) {
	    return false;
	}
	if (this == obj)
	    return true;
	if (obj instanceof Person) {
	    Person p = (Person) obj;
	    return this.name.equals(p.name) && this.age == p.age;
	}
	return false;
    }
}


自定义比较器:

package com.mth.test;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/* * 自定义自己的比较器 让TreeSet进行比较 * * */
//第一步
public class MyComparator implements Comparator<Person> {
    // 自定义以年龄进行比较
    @Override
    public int compare(Person p1, Person p2) {
	// TODO Auto-generated method stub
	int num = p1.getAge() - p2.getAge();
	// 等于0?就判断名字 如果不等于的话 直接返回num
	return num == 0 ? p1.getName().compareTo(p2.getName()) : num;
    }

    // 第二步
    // 只需要再new TreeSet对象的时候 把new MyComparator() 传进构造函数即可
    Set<Person> pset = new TreeSet<Person>(new MyComparator());
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值