zoukankan      html  css  js  c++  java
  • java学习笔记 HashSet 与 TreeSet

    Set接口并没有对Collection接口进行扩充,只是比Collection接口要求更加严格了,不能增加重复的元素,并且采用散列的储存方式,所以没有顺序

    import java.util.Set;
    import java.util.HashSet;
    import java.util.TreeSet;
    
    public class Test {
        public static void main(String[] args) {
            //Set allSet = new HashSet();//@结果 1
            Set allSet = new TreeSet();//@ 结果 2 java.lang.ClassCastException
            allSet.add(new Person("赵一",21));
            allSet.add(new Person("钱二",22));
            allSet.add(new Person("孙三",23));
            allSet.add(new Person("李四",24));
            allSet.add(new Person("周五",25));
            allSet.add(new Person("周五",25));
            
            allSet.add("A");allSet.add("A");
            System.out.println(allSet);
            
        }
    }
    
    class Person {
        String name;
        int age;
        
        Person(String name,int age) {
            this.name = name;
            this.age = age;    
        }
        
        public String toString() {
            return this.name + this.age;    
        }
    }
    
    /*
    1.Set添加重复对象,编译期间可以通过,但是添加不了重复对象,对于重复元素只会添加一次。
    2.Set集类程序运行时向集合中加入元素的顺序并不是集合中的保存顺序。
    3.TreeSet中的元素是有序存放的,TreeSet每个对象所在的类都必须实现Comparable接口才能使用
    */

    TreeSet类中如果比较器中某个属性没有比较,则会认为是同一个对象。

    import java.util.Set;
    import java.util.HashSet;
    import java.util.TreeSet;
    
    public class Test {
        public static void main(String[] args) {
            Set allSet = new TreeSet();
            allSet.add(new Person("赵一",21));
            allSet.add(new Person("钱二",22));
            allSet.add(new Person("孙三",23));
            allSet.add(new Person("李四",24));
            allSet.add(new Person("周五",25));
            allSet.add(new Person("周五",25));
            allSet.add(new Person("郑六",25));
            
    
            System.out.println(allSet);
            
        }
    }
    
    class Person implements Comparable<Person> {//? 为什么一定要写Comparable<Person>
        String name;
        int age;
        
        Person(String name,int age) {
            this.name = name;
            this.age = age;    
        }
        
        public String toString() {
            return this.name + this.age;    
        }
        
      public int compareTo(Person p) {
            
            //对象比较
            if (this.age > p.age) {
                return 100;    
            }
            if (this.age < p.age) {
                return -100;    
            }
            //return 0;//并不能把(郑六,15)添加进去
            //名字字符串的比较
            return this.name.compareTo(p.name);
                    
        }
        
    }
    
    
    /*
    1.TreeSet中的元素是有序存放的,TreeSet每个对象所在的类都必须实现Comparable接口才能使用
    2.如果比较器中某个属性没有比较,则会认为是同一个对象。
    3.此程序中并没有写equals()和hashCode()方法。全部由compareTo()方法完成。
    */

    一个完整的类应该重写equals(),toString(),hashCode()方法

    import java.util.Set;
    import java.util.HashSet;
    import java.util.TreeSet;
    
    public class Test {
        public static void main(String[] args) {
            Set allSet = new TreeSet();
            allSet.add(new Person("赵一",21));
            allSet.add(new Person("钱二",22));
            allSet.add(new Person("孙三",23));
            allSet.add(new Person("李四",24));
            allSet.add(new Person("周五",25));
            allSet.add(new Person("周五",25));
            allSet.add(new Person("郑六",25));
            
    
            System.out.println(allSet);
            
        }
    }
    
    class Person implements Comparable<Person> {
    //class Person{
        String name;
        int age;
        
        Person(String name,int age) {
            this.name = name;
            this.age = age;    
        }
        
        public String toString() {
            return this.name + this.age;    
        }
        
        
        public boolean equals(Object obj) {
            if (obj instanceof Person) {
                Person p = (Person)obj;
                if (this.name.equals(p.name) && this.age == p.age) {
                    return true;    
                }
            }
            if (this == obj) {
                return true;    
            }
            return false;
        }
        
        public int hashCode() {
            return this.name.hashCode() * this.age;    
      }
      
        public int compareTo(Person p) {
            
            //年龄比较
            if (this.age > p.age) {
                return 100;    
            }
            if (this.age < p.age) {
                return -100;    
            }
            //return 0;//并不能把(郑六,15)添加进去
            return this.name.compareTo(p.name);
        }
    }
    
    
    /*
    1.一个完整的类应该重写equals(),toString(),hashCode();方法
    */

  • 相关阅读:
    JZOJ5906 传送门
    JZOJ5907 轻功
    JZOJ5904 刺客信条
    JZOJ5347 遥远的金字塔
    JZOJ5344 摘果子
    JZOJ4742 单峰
    JZOJ4725 质数序列
    JZOJ2499 东风谷早苗
    JZOJ4737 金色丝线将瞬间一分为二
    最后的财产——模板大全
  • 原文地址:https://www.cnblogs.com/yhwsy/p/5721895.html
Copyright © 2011-2022 走看看