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]



     




  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值