现在的位置: 首页 > 综合 > 正文

set集合的唯一性(二)——TreeSet

2019年09月19日 ⁄ 综合 ⁄ 共 3019字 ⁄ 字号 评论关闭


TreeSet
    它既然属于set,那么它也遵循无序、唯一,但TreeSet说无序是指它的存入顺序和取出顺序不一致,而它取出的顺序也是有序的,是按照自然循序(即字典顺序)取出的。
    保证TreeSet唯一性共有两种方法:

               方法一:通过自定义类实现comparable接口并重写compareTo()来保证唯一性;

例:

package collection;

import java.util.TreeSet;

//TreeSet元素是自定义类,如何保证元素的唯一性

//方式一:利用自定义类实现comparable接口并重写compareTo()来保证唯一性
public class TreeSetDemo2 {
	public static void main(String[] args) {
		// 创建TreeSet集合
		TreeSet<Human> ts = new TreeSet<Human>();
		// 创建Human对象
		Human s1 = new Human("zhangsan", 21);
		Human s2 = new Human("lisi", 22);
		Human s3 = new Human("wangwu", 23);
		Human s4 = new Human("zhaoliu", 24);
		Human s5 = new Human("lisi", 22);
		Human s6 = new Human("qiaoqi", 25);
		Human s7 = new Human("zhangsan", 21);
		Human s8 = new Human("zhangsan", 29);
		// 添加元素
		ts.add(s1);
		ts.add(s2);
		ts.add(s3);
		ts.add(s4);
		ts.add(s5);
		ts.add(s6);
		ts.add(s7);
		ts.add(s8);

		// 遍历元素
		for (Human str : ts) {
			System.out.println(str.getName() + "---" + str.getAge());
		}
	}
}

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

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

	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;
	}

	@Override
	public int compareTo(Human h) {
		//重写compareTo(),并按照名字的自然顺序其次年龄从小到大排序
		int result = this.getName().compareTo(h.getName());
		result = (result == 0) ? (this.getAge() - h.getAge()) : result;
		return result;
	}
}

               方法二:利用TreeSet带参构造,保证元素的唯一性。
例:

package collection;

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

//TreeSet元素是自定义类,如何保证元素的唯一性

//方式二:利用TreeSet带参构造,保证元素的唯一性
public class TreeSetDemo3 {
	public static void main(String[] args) {
		// 创建TreeSet集合
		TreeSet<Teacher> ts = new TreeSet<Teacher>(new Comparator<Teacher>() {
			@Override
			public int compare(Teacher o1, Teacher o2) {
				//重写compare(),并按照名字的自然顺序其次年龄从小到大排序
				int result = o1.getName().compareTo(o2.getName());
				result = (result == 0) ? (o1.getAge() - o2.getAge()) : result;
				return result;
			}
		});
		// 创建Teacher对象
		Teacher t1 = new Teacher("zhangsan", 21);
		Teacher t2 = new Teacher("lisi", 22);
		Teacher t3 = new Teacher("wangwu", 23);
		Teacher t4 = new Teacher("zhaoliu", 24);
		Teacher t5 = new Teacher("lisi", 22);
		Teacher t6 = new Teacher("qiaoqi", 25);
		Teacher t7 = new Teacher("zhangsan", 21);
		Teacher s8 = new Teacher("zhangsan", 29);
		// 添加元素
		ts.add(t1);
		ts.add(t2);
		ts.add(t3);
		ts.add(t4);
		ts.add(t5);
		ts.add(t6);
		ts.add(t7);
		ts.add(s8);

		// 遍历元素
		for (Teacher str : ts) {
			System.out.println(str.getName() + "---" + str.getAge());
		}
	}
}

class Teacher {
	private String name;
	private int age;

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

	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;
	}
}

总结:TreeSet是基于TreeMap,而TreeMap又是基于二叉树,所以,在通过comparable的compareTo()或者comparator的compare()后,元素会通过返回的int值分为三种情况

                                                                                                          |--正数,存放在被比较元素的右边
                                                                                                          |-- 0  ,替换被比较元素
                                                                                                          |--负数,存放在被比较元素的左边
它不仅保证了元素的唯一性,而且根据自定义的比较器,迭代出的顺序也是可以自定义的。

【上篇】
【下篇】

抱歉!评论已关闭.