TreeSet设定的比价规则【外部比较器comparator与内部比较器comparable的比较】

TreeSet的特征是集合中的元素是有序并且唯一的

在创建TreeSet对象的时候,是需要设定比较规则的

设定比较规则有两种方式:一种是使用comparator设定外部比较规则,另一种是通过comparable设定内部比较规则

comparable内部比较器

public class Person implements Comparable<Person>{ 

           @Override 

       public int compareTo(Person o) { 

                

               //return this.name.compareTo(o.getName()); 

               //return this.name.length()-o.getName().length(); 

               return this.age-o.getAge(); 

       } 

} 

comparator外部比较器 

public class AgeCom implements Comparator<Person> { 


       @Override 

       public int compare(Person o1, Person o2) { 

                

               return o1.getAge()-o2.getAge(); 
       } 
} 

1、创建类,并且同时写内部比较规则

package com.wyq.Arr;

public class Pers implements Comparable<Pers>{
	/**
	 * person类实现了Compatator接口
	 * 那么他具备一种能力,就是比较的能力
	 */
	private String name;
	private Gender gender;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Pers(String name, Gender gender, int age) {
		super();
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
	public Pers() {
		super();
	}
	
	
	@Override
	public int compareTo(Pers o) {
		//按照年龄进行比较
//		return this.age-o.getAge();
		//字母的升序进行比较
//		return this.name.compareTo(o.getName());
		//按照字母的长度进行比较
		return this.name.length()-o.getName().length();
	}
}

2、创建外部比较规则

package com.wyq.Arr;

import java.util.Comparator;

public class AgeCom implements Comparator<Pers>{

	@Override
	public int compare(Pers o1, Pers o2) {
		return o1.getAge()-o2.getAge();
	}

}

3、创建测试类

package com.wyq.Arr;

import java.util.TreeSet;

public class TestPers {
	public static void main(String[] args) {
		//创建treeset对象的集合,明确了存储的对象的类型只能是pers类型
		TreeSet<Pers> ts = new TreeSet<Pers>(new AgeCom());
		/**
		 * 因为TreeSet集合存储的元素的特点是:有序,唯一
		 * 需要存储的对象要具备比较规则
		 * 如果存储的自定义对象,不具备比较规则,那么程序就将产生类型转换异常
		 */
		Pers p1 = new Pers("张三",Gender.女,30);
		Pers p2 = new Pers("李四",Gender.男,32);
		Pers p3 = new Pers("王五",Gender.女,31);
		Pers p4 = new Pers("马六",Gender.男,20);
		ts.add(p1);
		ts.add(p2);
		ts.add(p3);
		ts.add(p4);
		System.out.println(ts.size());
		for(Pers str:ts){
			System.out.println(ts);
		}
	}

}

上边代码中在创建TreeSet对象的时候,同时设定了内部比较规则和外部比较规则,但是当二者同时出现的时候,外部比价规则更有优先级。

上一篇:Java——四个重要接口


下一篇:java – 为什么Collections.sort用相同的参数调用Comparator两次?