集合框架之TreeSet集合

版权声明:关注微信公众号:摸鱼科技资讯,联系我们 https://blog.csdn.net/qq_36949176/article/details/87884978

TreeSet集合

会对元素进行排序,自然顺序排列(如abcd...xyz),SET集合都保证了元素的唯一性。

TreeSet集合:可以对Set集合中的元素进行排序。是不同步的。 
                判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。 
                
                TreeSet对元素进行排序的方式一:
                让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。

实现Comparable接口,覆盖compareTo方法:可以自定义排序方式
                
                如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。怎么办?
                可以使用TreeSet集合第二种排序方式二:
                让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。
                将该类对象作为参数传递给TreeSet集合的构造函数。
 例如:

Person类:

package cn.itcast.p.bean;

public class Person /*extends Object*/ implements Comparable {

	private String name;
	private int age;
	
	
	public Person() {
		super();
		
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	
	
	@Override
	public int hashCode() {
//		System.out.println(this+".......hashCode");
		
		return name.hashCode()+age*27;
//		return 100;
	}
	@Override
	public boolean equals(Object obj) {
		
		if(this == obj)
			return true;
		if(!(obj instanceof Person))
			throw new ClassCastException("类型错误");
		
//		System.out.println(this+"....equals....."+obj);
		Person p = (Person)obj;
		
		
		
		return this.name.equals(p.name) && this.age == p.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;
	}
	public String toString(){
		return name+":"+age;
	}
	@Override
	public int compareTo(Object o) {
		
		Person p = (Person)o;
		
		int  temp = this.age-p.age;
		return temp==0?this.name.compareTo(p.name):temp;
		
//		int  temp = this.name.compareTo(p.name);
//		return temp==0?this.age-p.age:temp;
		
		/*
		if(this.age>p.age)
			return 1;
		if(this.age<p.age)
			return -1;	
		
		else{
			
			return this.name.compareTo(p.name);
		}
		*/
		
	}
	
}

自定义一个类实现Comparator接口,覆盖compare方法。

比较器

创建了一个根据Person类的name进行排序的比较器。

ComparatorByName实现接口:

package cn.itcast.p5.comparator;

import java.util.Comparator;

import cn.itcast.p.bean.Person;
/**
 * 创建了一个根据Person类的name进行排序的比较器。
 */
public class ComparatorByName implements Comparator {

	@Override
	public int compare(Object o1, Object o2) {

		Person p1 = (Person)o1;
		Person p2 = (Person)o2;
		
		int temp = p1.getName().compareTo(p2.getName());
		
		return temp==0?p1.getAge()-p2.getAge(): temp;
//		return 1;//有序。
	}

}

测试类:

package cn.itcast.p5.treeset.demo;

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

import cn.itcast.p.bean.Person;
import cn.itcast.p5.comparator.ComparatorByName;

public class TreeSetDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		TreeSet ts = new TreeSet(new ComparatorByName());
		
		/*
		 * 以Person对象年龄进行从小到大的排序。
		 * 
		 */
		
		ts.add(new Person("zhangsan",28));
		ts.add(new Person("lisi",21));
		ts.add(new Person("zhouqi",29));
		ts.add(new Person("zhaoliu",25));
		ts.add(new Person("wangu",24));
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			Person p = (Person)it.next();
			
			System.out.println(p.getName()+":"+p.getAge());
		}
	
	}



	/**
	 * 
	 */
	public static void demo1() {
		TreeSet ts = new TreeSet();
		
		ts.add("abc");
		ts.add("zaa");
		ts.add("aa");
		ts.add("nba");
		ts.add("cba");
		
		Iterator it = ts.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}

运行结果:

lisi:21
wangu:24
zhangsan:28
zhaoliu:25
zhouqi:29

猜你喜欢

转载自blog.csdn.net/qq_36949176/article/details/87884978