java學習之路-----集合(類集)-------set


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]



     




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章