/*TreeSet类:不允许重复,存储的每一个元素都会进行比较,相同的元素就不存,不相同的元素,会按照自然顺序存储,指的就是自己重写的compareTo方法的比较方式存储
- 所以,用到该集合的时候,就要实现Comparable接口,重写他的compareTo方法,因为对象比较就是用的compareTo方法,不这样的话就会报错,因为他不知道怎么比较元素的大小
- HashSet集合:用到的时候就要重写hashCode方法如何计算哈希值,和equals方法如何写条件判断两个元素相同
- 如果用到contains方法,就要重写equals方法,因为确定包不包含实际上就是判断该元素与集合中的其他元素是否相同
- 如果想取出自定义的元素,就要重写该对象类的toString方法
* 开发用:
- 问题:使用TreeSet集合时,我只能让元素的类实现Comparable接口才能比较吗?
- 我可以让TreeSet集合具有比较功能,万一元素所在类的compareTo方法不是我写的,或者我不想用,我可以自己定义一个TreeSet集合的比较方式
- TreeSet ts = new TreeSet(Comparator//比较器 p);Comparator是个接口
- public class ZDYBJ implements Comparator(){
-
public int compare(Object o1,Object o2){
-
Student s1 = (Student)o1;
-
Student s2 = (Student)o2;
-
int temp = s1.getName().compareTo(s2.getName());
-
return temp==0?s1.getAge()-s2.getAge():temp;
-
}
- }
- TreeSet ts = new TreeSet(new ZDYBJ());这样的话,添加进去的元素所在的类即使不写或者写了compareTo方法,都会按照你所写的比较器中的比较方式比较!!!
- */
package cn.TreeSetDemo;
import java.util.Iterator;
import java.util.TreeSet;
import javafx.animation.Interpolator;
class Student implements Comparable{
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
this.name = name;
this.age = 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) {
// TODO Auto-generated method stub
//1,将Object类行强转成Student类型
Student s = (Student)o;
/*
//2,设置比较的定义,比什么
if(this.age>s.age)
return 1;
if(this.age<s.age)
return -1;
// return 0;
//这样是不全面的,因为年龄相同就视为相同,相同元素就不会被存储,那么如果此时年龄一样,姓名不一样呢?所以,我们还想增加一步姓名的比较
else
return this.name.compareTo(s.name);
//这样写就没有问题了,但是这样写代码不好,繁琐,且不好
*/ int temp = this.age-s.age;
return temp==0?this.name.compareTo(s.name):temp;
//如果我想按照有序输出,也就是真没存进来的,怎么输出去,顺序不变输出
// return 1;返回1》o说明下一个比上一个元素大,输出时位子就不会发生变法
}
}
public class TreeSetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet ts = new TreeSet();
ts.add(new Student("huang",23));
ts.add(new Student("zhang",22));
ts.add(new Student("li",29));
ts.add(new Student("aw",26));
ts.add(new Student("www",23));
Iterator it = ts.iterator();
while(it.hasNext())
System.out.println(it.next());
}
//结果为:异常。为什么会报错?
//因为TreeSet集合会对存入的元素进行自然地排序,eg:如果存入的元素是String类型的元素,那么就会按照字母的asc值大小进行排序
//而我的Student类并没有对象之间比较的方式,不知道怎么比,所以会报错
//那应该怎么办呢?
//对象之间比较用compareTo方法,而改方法在Comparable接口中,所以,需要实现接口,并重写compareTo方法
}