相同点: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接口:
如图: