君子攸宁

导航

TreeSet比较器

TreeSte:二叉树数据结构。可以对元素进行排序,不同步的

如何保证元素唯一性?

参考的就是比较犯法的返回值是否是0,是,就是重复元素,不存。

排序方式:需要元素具备比较功能,所以元素需要实现Comarable接口。覆盖CompareTo方法。

 

需求中也有这样一种情况:元素具备的比较功能不是所需要的,也就是说不想按照自然

排序的方式,而是按照自定义的排序方式对元素进行排序。

而且,存储到TreeSTet中的元素万一没有比较功能该如何排序呢?比如学生类是别人写的,没有定义学生类的排序方法。

这时候,就只能使用第二种比较方式:是让集合具备比较功能,定义一个比较器

 

实现Comparator接口,覆盖compare方法。将Comparator接口的对象,

作为参数传递给TreeSet集合的构造函数

 

比较器更为灵活,自然排序通常作为元素的默认排序

package java_test;

 class Students implements Comparable{
	private String name;
	private int age;
	
	
	public Students() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Students(String name, int age) {
		super();
		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 String toString() {
		return "Students [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		return 0;
	}

	
 }
 
 
 
	
	

  ======================

package java_test;

import java.util.Comparator;

/**
 * 自定义一个比较器,用来对学生对象按照姓名进行排序	
 * @author ningpuyong
 *
 */
public class ComapretoByName implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {
		
		Students s1 = (Students)o1;
		Students s2 = (Students)o2;
		
		int temp= s1.getName().compareTo(s2.getName());
		
		return temp==0?s1.getAge()-s2.getAge():temp;
	}

}

  ===============

package java_test;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo2 {
	public static void main(String[] args) {
		
		//初始化TreeSet集合时明确一个比较器。让集合具备比较性,把元素直接存进来就行
		Set set = new TreeSet(new ComapretoByName());
		
		
		set.add(new Students("xiaozhang",25));
		set.add(new Students("xiaoming",21));
		set.add(new Students("daniu",22));
		set.add(new Students("tudou",27));


		for (Iterator it = set.iterator(); it.hasNext();) {
			Students stu = (Students) it.next();
			System.out.println(stu);

		}
	}
}

  ========

运行结果:

 

Students [name=daniu, age=22]

Students [name=tudou, age=27]

Students [name=xiaoming, age=21]

Students [name=xiaozhang, age=25]

 

posted on 2017-08-16 11:07  君子攸宁  阅读(310)  评论(0编辑  收藏  举报