关闭

java学习之路-----集合(类集)-------set

893人阅读 评论(1) 收藏 举报
分类:

1.hashset
               public class HashSetDemo {
           public static void main(String[] args) {
              Set<String> set= new HashSet<String>();
              
              set.add( "A");
              set.add( "B");
              set.add( "C");
              set.add( "D");
              set.add( "E");
              set.add( "A");//重复添加
              set.add( "B");
              set.add( "F");
              
              System. out.println(set);
              
          }
}

结果:
[D, E, F, A, B, C]

从结果中发现Hashset集合是不重复且无序的
2.有序的TreeSet

public class TreeSetDemo {
     public static void main(String[] args) {
          Set<String>set= new TreeSet<String>();
          
          set.add( "C");
          set.add( "B");
          set.add( "A");
          set.add( "D");
          set.add( "E");
          set.add( "A");//重复添加
          set.add( "B");
          set.add( "F");
          
          System. out.println(set);
     }

}
结果:
[A, B, C, D, E, F]
3.对TreeSet排序的探索
既然TreeSet可以排序,那么它可以对我们自己写的类型进行排序不?
          
class Person{
     private String Name;
     
     private int age ;

     public String getName() {
           return Name ;
     }

     public void setName(String name) {
           Name = name;
     }

     public int getAge() {
           return age ;
     }

     public void setAge(int age) {
           this.age = age;
     }

     public Person(String name, int age) {
           Name = name;
           this.age = age;
     }
     
     
}

public class TreeSetDemo1 {
     public static void main(String[] args) {
          Set<Person> set= new TreeSet<Person>();
          
          set.add( new Person("aaa" , 12));
          set.add( new Person("adc" , 12));
          set.add( new Person("abc" , 12));
          set.add( new Person("aac" , 12));
          set.add( new Person("aaa" , 13));
          
          System. out.println(set);
     }

}

结果:
Exception in thread "main" java.lang.ClassCastException: JHTest.Person cannot be cast to java.lang.Comparable
     at java.util.TreeMap.compare( TreeMap.java:1188)
     at java.util.TreeMap.put( TreeMap.java:531)
     at java.util.TreeSet.add( TreeSet.java:255)
     at JHTest.TreeSetDemo1.main( TreeSetDemo1.java:41)

类转换错误

出现这个错误的原因是对于一个对象要想排序,必须要实现排序法则,且对象所在类必须实现Comparable接口

4.探索继续

class Person implements Comparable<Person>{
     private String name;
     
     private int 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 Person(String name, int age) {
           this.name = name;
           this.age = age;
     }

     public int compareTo(Person per) {
           if(this .age >per.age ){
               return 1;
          } else if (this.age<per.age){
               return -1;
          } else {
               return 0;
          }
          
          
          
     }

     @Override
     public String toString() {
     
           return "名字" +this.name+"年龄"+ this.age ;
     }
     
     
     
}

public class TreeSetDemo1 {
     public static void main(String[] args) {
          Set<Person> set= new TreeSet<Person>();
          
          set.add( new Person("aaa" , 12));
          set.add( new Person("adc" , 12));
          set.add( new Person("abc" , 10));
          set.add( new Person("aac" , 11));
          set.add( new Person("aaa" , 13));
          
          System. out.println(set);
     }

}

结果:
[名字abc年龄10, 名字aac年龄11, 名字aaa年龄12, 名字aaa年龄13]



 补充:这个发现有个 new Person("adc" , 12)这个没有加进来,这是因为之比较了一个属性,那treeSet就只会比较一个属性,如果这个属性相同,就认为是一个对象

5.对HashSet的探索(关于重复元素)
     class Per{
     private  String name;
     private String age;
     public String getName() {
           return name ;
     }
     public void setName(String name) {
           this.name = name;
     }
     public String getAge() {
           return age ;
     }
     public void setAge(String age) {
           this.age = age;
     }
     public Per(String name, String age) {
           this.name = name;
           this.age = age;
     }
     @Override
     public String toString() {
          
           return "名字" +this.name+"姓名"+ this.age ;
     }
     
     
}


public class HashSetDemo1 {
     public static void main(String[] args) {
          Set<Per> set= new HashSet<Per>();
          
          set.add( new Per("AAA" , "10" ));
          set.add( new Per("BBB" , "11" ));
          set.add( new Per("AAA" , "12" ));
          set.add( new Per("AAB" , "13" ));
          set.add( new Per("ABA" , "10" ));
          set.add( new Per("AAA" , "10" ));
          
          System. out.println(set);
     }

}

结果:
[名字AAB姓名13, 名字AAA姓名10, 名字BBB姓名11, 名字AAA姓名10, 名字AAA姓名12, 名字ABA姓名10]

我们发现这里重复了?

这里如果想要比较我们的类型的对象是否重复就要覆写Object 的equals方法和hashCode方法

class Per{
      private  String name;
      private int 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;
     }
     
     
      @Override
      public String toString() {
          
           return "名字" + this. name+ "姓名"+ this .age ;
     }
      @Override
      public int hashCode() {
          
           return this .name .hashCode() * this. age;
     }
      @Override
      public boolean equals(Object obj) {
           if (this ==obj){
               return true ;
          }
          
           if (!(obj instanceof Per)){
               return false ;
          }
          
          Per p=(Per)obj;
          
           if (this .name .equals(p. name)&& this .age ==p.age ){
               return true ;
          } else {
               return false ;
          }
          
          
     }
     
      public Per(String name, int age) {
           this .name = name;
           this .age = age;
     }
     
     
     
}


public class HashSetDemo1 {
      public static void main(String[] args) {
          Set<Per> set= new HashSet<Per>();
          
          set.add( new Per("AAA" , 10));
          set.add( new Per("BBB" , 11));
          set.add( new Per("AAA" , 12));
          set.add( new Per("AAB" , 13));
          set.add( new Per("ABA" , 10));
          set.add( new Per("AAA" , 10));
          
          System. out .println(set);
     }

}

结果:
[名字AAA姓名12, 名字ABA姓名10, 名字AAA姓名10, 名字AAB姓名13, 名字BBB姓名11]



     




3
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:85196次
    • 积分:1828
    • 等级:
    • 排名:千里之外
    • 原创:97篇
    • 转载:1篇
    • 译文:0篇
    • 评论:15条
    博客专栏
    最新评论