HashSet 和 TreeSet
TreeSet的第一种排序 元素自身拥有比较功能 哈哈
/**
* Set 无序的,不可以重复元素
* |--HashSet: 底层数据结构是哈希表, 线程不同步
* hashSet是如何保证元素唯一性呢?
* 是通过元素的两个方法, hashCode 和 equals 来完成的
* 如果元素的hashCode值相同,才会判断equals 是否为true
* 如果元素的hashCode值不同,不会调用 equals.
*
* 注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法.
*
* |--TreeSet: 可以对Set集合中的元素进行排序
* 底层数据结构式是二叉树
* 保证元素唯一性的依据
* compareTo 方法 return 0 TreeSet 中就只会有一个 元素
*
* TreeSet排序的第一种方式,让元素自身具备比较性,
* 元素需要实现Comparable接口,覆盖compareTo 方法
* 这种方式 也成为元素的自然顺序,或者叫默认顺序.
*
* TreeSet的第二种排序方式.
* 当元素自身不具备比较性时,或者具备的比较性不是所需要的 .
* 这是就需要让集合自身具备比较性.
* 在集合初始化时,就有了比较方式.
*
*
* 需求:
* 往TreeSet集合中存储自定义对象学生
* 想按照学生的年龄进行排序.
*
* 记住:排序时,当主要条件相同时,一定要判断一下次要条件.
*
*/
public class TreeSetDemo {
public static void main(String[] args) {
method_1();
System.out.println("=======================");
method_2();
}
//保存自定义对象
public static void method_2(){
TreeSet ts=new TreeSet();
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));
ts.add(new Student("lisi01",40));
ts.add(new Student("lisi007",30));
ts.add(new Student("lisi09",36));
ts.add(new Student("lisi01",29));
ts.add(new Student("lisi01",90));
Iterator it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}
}
//保存普通对象
public static void method_1(){
TreeSet ts= new TreeSet();
ts.add("cba");
ts.add("abcd");
ts.add("aaa");
ts.add("bca");
Iterator it =ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
//使用TreeSet来保存自定义对象
class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
@Override
public int compareTo(Object obj) {
// TODO Auto-generated method stub
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student stu=(Student)obj;
if(this.age>stu.age)
return 1;
else if(this.age==stu.age){
//return 0;
//如果年龄相同的时候 就需要按照姓名排序
return this.name.compareTo(stu.name);
}
return -1;
}
}
TreeSet 的第二种比较方式(当元素自身不具备比较方法的时候)
/**
* TreeSet的第二种排序方式.
*
* 当元素自身不具备比较性时,或者具备的比较性不是所需要的 .
* 这是就需要让集合自身具备比较性.
* 在集合初始化时,就有了比较方式.
* 步骤
* 1.定义比较器 (定义一个类,实现Comparator,覆盖compare方法.)
* 2.传递给 TreeSet比较器
*
* 注意:
* 当两种排序都存在时候,以比较器为主.
*
*
* 需求变了:
* 要改成 name排序 这样我们为了 不需改 Student 的原比较方法 我们定义一个比较器 采用 name进行比较
*/
public class TreeSetDemo1 {
public static void main(String[] args) {
//之前才使用 age比较
method_1();
//需求变了 要改成 name排序 这样我们为了 不需改 Student 的原比较方法 我们定义一个比较器 采用 name进行比较
System.out.println("==========================");
//改成使用 name比较
method_2();
}
public static void method_2(){
//这样就可以 实现 name比较了哦
TreeSet ts=new TreeSet(new StudentComparator());
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));
Iterator it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}
}
public static void method_1(){
TreeSet ts=new TreeSet();
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));
Iterator it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}
}
}
class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
@Override
public int compareTo(Object obj) {
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student stu=(Student)obj;
return new Integer(this.age).compareTo(new Integer(stu.getAge()));
}
}
class StudentComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
Student t1=(Student)o1;
Student t2=(Student)o2;
int num=t1.getName().compareTo(t2.getName());
if(num==0)
return new Integer(t1.getAge()).compareTo(new Integer(t2.getAge()));
return num;
}
}
TreeSet练习
/**
* 练习 :按照字符串的长度排序
* 字符串本身具备比较性,但是他的比较方式不是所需要的.
*
* 这时就只能使用比较器.
* 注意 : 主要和次要条件的比较
*/
public class TreeSetTest {
public static void main(String[] args) {
TreeSet ts=new TreeSet(new StrLenComparator());
ts.add("abcde");
ts.add("cc");
ts.add("bad"); //长度都相同 内容不同
ts.add("gdg"); //长度都相同 内容不同
ts.add("hahaha");
Iterator it=ts.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
class StrLenComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
String s1=(String)o1;
String s2=(String)o2;
/*
if(s1.length()>s2.length())
return 1;
if(s1.length()==s2.length())
return 0;
return -1;
*/
int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
//主要条件判断完了 判断次要条件
if(num==0)
return s1.compareTo(s2);
return num;
}
}