学TreeSet集合感觉就是差不多在学 Comparator/Comparable比较器 ,因为TreeSet集合中的元素要求必须是可比较的,所以必须使用上面两个比较器之一;
那么这两个比较器的区别在哪里呢?
首先是Comparable比较器:是定义一种默认的比较规则;
Comparator比较器:可以定义很多不同的比较规则
下面附实例代码以及详细注解:
首先是定义实例对象必不可少的一套流程(这里应该用不着写注解):
这里为了测试类赋值方便就多写了一个带参的构造方法
package 实例2;
public class pruson {
private String name;
private int num;
private double price;
public pruson(){
}
public pruson(String name, int num, double price) {
super();
this.name = name;
this.num = num;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + num;
long temp;
temp = Double.doubleToLongBits(price);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
pruson other = (pruson) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (num != other.num)
return false;
if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
return false;
return true;
}
@Override
public String toString() {
return "pruson [name=" + name + ", num=" + num + ", price=" + price + "]";
}
}
接下来是测试类
package 实例2;
/*
* 1)TreeSet集合要求元素必须是比较的,TreeSet集合先看是否有Comparator比较器,
* 如果没有Comparator比较器,在查找元素的类是否实现了Comparator接口
* 2)Comparator和Comparable的区别??
* 一般情况下,类实现Comparable接口定义一个默认的比较规则
* 可以通过Comparator定义很多不同的比较规则
* 3)在TreeSet集合中,判断是否同一个对象是根据Comparator/Comparable的比较结果是否为0进行判断的
* 如果两个元素的比较结果为0就认为是同一个元素
* 注意:TreeSet集合不能存储重复的元素,即集合中如果已经存在该元素,不再添加重复元素
*/
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class test {
public static void main(String[] args) {
//创建TreeSet集合,并且使用泛型限制其格式,在使用Comparator比较器来定义比较规则
TreeSet<pruson> ts=new TreeSet<pruson>(new Comparator<pruson>() {
@Override
public int compare(pruson o1, pruson o2) {
// TODO Auto-generated method stub
if(o1.getPrice()>o2.getPrice()) {
return 1;
}else if(o1.getPrice()<o2.getPrice()) {
return -1;
}else {
return 0;
}
}
});
ts.add(new pruson("小米",1000,5021.0));
ts.add(new pruson("联想",5000,56021.0));
ts.add(new pruson("苹果",11000,55021.0));
ts.add(new pruson("戴尔",11890,5000.0));
//通过迭代把集合中的pruson打印出来
Iterator<pruson> iterator = ts.iterator();
while (iterator.hasNext()) {
pruson pruson = (pruson) iterator.next();
System.out.println(pruson);
}
}
}