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

本文详细探讨了HashSet和TreeSet两种集合的特点与使用方法。针对HashSet如何判断元素重复及TreeSet如何实现排序进行了深入分析,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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]



     




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值