java TreeSet集合去除按规定相同的对象

TreeSet主要用于排序,底层用二叉树实现

* 1.特点
    * TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
* 2.使用方式
    * a.自然顺序(Comparable)
        * TreeSet类的add()方法中会把存入的对象提升为Comparable类型
        * 调用对象的compareTo()方法和集合中的对象比较
        * 根据compareTo()方法返回的结果进行存储
    * b.比较器顺序(Comparator)
        * 创建TreeSet的时候可以制定 一个Comparator
        * 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
        * add()方法内部会自动调用Comparator接口中compare()方法排序
        * 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
    * c.两种方式的区别
        * TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
        * TreeSet如果传入Comparator, 就优先按照Comparator


person类:(setter 和getter已忽略 )

public class Person implements Comparable<Person>{
	private String name;
	private int age;

测试类中:

 

TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("a",1));
ts.add(new Person("b",3));
ts.add(new Person("b",3));
ts.add(new Person("c",2));
System.out.println(ts);
/**
		 * Person实现Comparable接口  
		 */
public class Person implements Comparable<Person>{

}
/*
	 * (non-Javadoc)
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 * 0  一个元素
	 * 1 正序输出
	 * -1逆序输出
	 */

根据年龄排序:

public int compareTo(Person o) {
		int number = this.age - o.age;
		return number == 0?this.name.compareTo(o.name) : number;
	}

根据姓名Unicode排序:

/**
	 * 按照姓名UniCode排序
	 */
	@Override
	public int compareTo(Person o) {
		int num = this.name.compareTo(o.name);
		return num == 0?this.age - o.age:num;
	}

根据姓名长度排序

/**
	 * 按照姓名长度排序
	 */
	@Override
	public int compareTo(Person o) {
		int length = this.name.length() - o.name.length();//比较长度为主要条件
		int num = length == 0? this.name.compareTo(o.name) : length;//比较内容为次要条件
		return num == 0? this.age  - o.age : num;//比较年龄次要条件
	}







猜你喜欢

转载自blog.csdn.net/pastthewind/article/details/80033435