集合框架—02—Set

来源:互联网 发布:淘宝卫浴架子 编辑:程序博客网 时间:2024/06/05 07:09

 

/*Set:元素是无序(存入和取出的顺序不一定一致)的,元素不可以重复。线程是非同步的。|--HashSet:底层数据结构式哈希表|HashSet是如何保证元素唯一性的呢?|是通过元素的两个方法,hashCode和equals来完成。|如果元素的hashCode值相同,才会判断equals是否为true。|如果元素的hashCode值不同,不会调用equals。|注意:对于判断元素是否存在以及删除等操作,依赖的方法|是元素的hashCode和equals方法。||--TreeSet: 可以对Set集合中的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据,compareTo方法return 0.TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为自然排序,或者叫默认排序。TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。*/import java.util.*;class HashSetDemo{public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args){HashSet hs = new HashSet();hs.add("java01");hs.add("java01");hs.add("java02");hs.add("java03");hs.add("java03");hs.add("java04");Iterator it = hs.iterator();while(it.hasNext()){sop(it.next());}}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*往hashSet集合中存入自定义对象,姓名和年龄相同为同一个人,重复元素*/import java.util.*;class Person{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}//public int hashCode()//{//System.out.println(this.name+"...hashCode");//return name.hashCode()+age;//}//public boolean equals(Object obj)//{//if(!(obj instanceof Person))//return false;////Person p = (Person)obj;//System.out.println(this.name+"...equals..."+p.name);////return this.name.equals(p.name) && this.age == p.age;////}public String getName(){return name;}public int getAge(){return age;}}class HashSetTest{public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args){HashSet hs = new HashSet();hs.add(new Person("a1",11));hs.add(new Person("a2",12));hs.add(new Person("a3",13));//hs.add(new Person("a2",12));//hs.add(new Person("a4",14));//sop("a1: "+hs.contains(new Person("a1",11)));//判断元素是否存在//hs.remove(new Person("a3",13));//删除元素Iterator it = hs.iterator();while(it.hasNext()){Person p = (Person)it.next();sop(p.getName()+"..."+p.getAge());}}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*需求:往TreeSet集合中存储自定义对象学生,想按照学生的年龄进行排序。记住:排序时,当主要条件相同时,一定要判断次要条件*/import java.util.*;class TreeSetDemo{public static void main(String[] args){TreeSet ts = new TreeSet();ts.add(new Student("lisi02",22));ts.add(new Student("lisi007",20));ts.add(new Student("lisi09",19));ts.add(new Student("lisi08",19));//ts.add(new Student("lisi01",40));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 int compareTo(Object obj){if(!(obj instanceof Student))throw new RuntimeException("不是学生对象");Student s = (Student)obj;System.out.println(this.name+"..comparTo.."+s.name);if(this.age>s.age)return 1;if(this.age==s.age){return this.name.compareTo(s.name);}return -1;}public String getName(){return name;}public int getAge(){return age;}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*当元素自身不具备比较性,或者具备的比较性不是所需要的。这时需要让容器自身具备比较性。定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。当两种排序都存在时,以比较器为主定义一个类,实现Comparator接口,覆盖compare方法。*/import java.util.*;class Student implements Comparable//该接口强制让学生具备比较性。{private String name;private int age;Student(String name, int age){this.name = name;this.age = age;}public int compareTo(Object obj){if(!(obj instanceof Student))throw new RuntimeException("不是学生对象");Student s = (Student)obj;if(this.age>s.age)return 1;if(this.age==s.age){return this.name.compareTo(s.name);}return -1;}public String getName(){return name;}public int getAge(){return age;}}class TreeSetDemo2{public static void main(String[] args){TreeSet ts = new TreeSet(new MyCompare());ts.add(new Student("lisi02",22));ts.add(new Student("lisi007",20));ts.add(new Student("lisi09",19));ts.add(new Student("lisi08",18));ts.add(new Student("lisi007",29));//ts.add(new Student("lisi01",40));Iterator it = ts.iterator();while(it.hasNext()){Student stu = (Student)it.next();System.out.println(stu.getName()+"..."+stu.getAge());}}}class MyCompare implements Comparator{public int compare(Object o1, Object o2){Student s1 = (Student)o1;Student s2 = (Student)o2;int num = s1.getName().compareTo(s2.getName());if(num==0){return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));/*if(s1.getAge()>s2.getAge())return 1;if(s1.getAge()==s2.getAge())return 0;return -1;*/}return num;}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*练习:按照字符串长度排序。字符串本身具备比较性。但是它的比较方式不是所需要的。这时就只能使用比较器。*/import java.util.*;class TreeSetTest{public static void main(String[] args){TreeSet ts = new TreeSet(new StrLenComparator());ts.add("abcd");ts.add("cc");ts.add("cba");ts.add("aaa");ts.add("z");ts.add("hahaha");Iterator it = ts.iterator();while(it.hasNext()){System.out.println(it.next());}}}class StrLenComparator implements Comparator{public int compare(Object o1, Object o2){String s1 = (String)o1;String s2 = (String)o2;int num =new Integer(s1.length()).compareTo(new Integer(s2.length()));if(num==0)return s1.compareTo(s2);return num;/*if(s1.length()>s2.length())return 1;if(s1.length()==s2.length())return 0;return -1;*/}}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

个人总结: