Comparator接口 和 Comparable接口在运用的上的比较

相同点:comparator 和 Comparable都是用于 Set,TreeSet等比较!都可以用于对,对象类型的比较!

不同点:Compatator接口中compare方法有两个参数,能对基本数据类型做比较,也能对类对象里的元素做比较。

                Comparable接口中compareTo方法有一个参数。用于对类对象里的元素进行比较。

compare:  对TreeSet里的基本数据类型做比较!

//实现有关comparator接口中的compare方法
public class MyComparatorTest {
	public static void main(String[] args) {
		TreeSet<Integer> tree = new TreeSet<>(new Mycomparator());
		tree.add(2);
		tree.add(1);
		tree.add(4);
		tree.add(3);		
		Iterator it = tree.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}	
	}
}
//对TreeSet中进行降序排序
class Mycomparator implements Comparator<Integer>{
	@Override
	public int compare(Integer o1, Integer o2) {		
		return -(o1-o2);
	}
}

输出结果:

注意:如果比较的TreeSet有相同的元素,会舍去后面那个元素!

compareTo对类对象里面的元素做比较!

注意:如果比较的TreeSet有相同的元素,会舍去后面个元素!

public class MyComparableTest {
	public static void main(String[] args) {
		TreeSet<Mycomparable> tree = new TreeSet<>();
		
		tree.add(new Mycomparable("李四", 12, 2, 3400));
		tree.add(new Mycomparable("李四", 12, 2, 3500));
		tree.add(new Mycomparable("李四", 12, 2, 3600));
		tree.add(new Mycomparable("王 五", 11, 4, 3300));
		tree.add(new Mycomparable("王 五", 19, 5, 3300));	
		tree.add(new Mycomparable("张三", 12, 1, 3200));
		Iterator it = tree.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}	
	}
}

class Mycomparable implements Comparable<Mycomparable>{
	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 int getEyear() {
		return Eyear;
	}
	public void setEyear(int eyear) {
		Eyear = eyear;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	private String name;
	private int age;
	private int Eyear;
	private int salary;
	
	@Override
	public String toString() {
		return "Mycomparable [name=" + name + ", age=" + age + ", Eyear=" + Eyear + ", salary=" + salary + "]";
	}	
	public Mycomparable(String name, int age, int eyear, int salary) {
		super();
		this.name = name;
		this.age = age;
		Eyear = eyear;
		this.salary = salary;
	}	
	//按照他们年龄比较,降序
	public int compareTo(Mycomparable o) {
		if(this.age==o.age)
		{
			return this.name.compareTo(name);
		}
		return this.age>o.age?-1:1;		
	}
}

输出结果:

那么问题来了!  

如果不想舍去相同的元素怎么办?

答案:不能,因为TreeSet继承于Set,而Set这个集合本身是不能存放两个相同的元素的。

但是!!!!有两种方法可以!!!!

第一种:

可以变相存放输出两个相似的数比如:

1   张三  男  19  10000元    

2   张三   男  19  10000元

可以通过让 前面的 1, 2 索引不相同来变相的存放相同的元素数据!

注意: 如果你同时调用了这两种方式,若在TreeSet种new 过会优先调用Compare!

第二种:比较返回值是不是0;

注意:如果你TreeSet中new 的是你建立的类的属性,你可以比较他们然后return 1;不是0就行;

因为 TreeSet是一个底层是红黑树的数据结构,返回值如果是0的话  会put元素=null;

如果你是用的基本类型类或者String等引用类型就不能通过return 1;来打破TreeSet中唯一性!

因为该类型继承了comparable接口:

如图:

猜你喜欢

转载自blog.csdn.net/mswuxianshen/article/details/81409741