zoukankan      html  css  js  c++  java
  • 第8篇 Java中的集合(Set)

    Java 集合的 Set 接口

    Set类型与List类型的区别

    • Set: 无序、不可重复
    • List: 有序、可重复

    1、HashSet

    HashSet的存储结构:HashMap

    特点:

    • HashSet通过比较存放的哈希码(hashCode)来确定对象存放的位置
    • 当两个对象的哈希值相等时,HashSet通过对象的equals方法来判断两个对象是否相同,如果相同则丢弃该对象

    由于判断元素是否存在的依据是hashCode和equals方法,所以我们在使用时通常重写类的这两个方法,来达到自定义对象比较规则的目的。

    该比较只实现判断两个对象是否相同,从而达到存放不重复的效果,并无排序功能。

    重写hashCode()和equals(Object obj)方法实现对象比较

    /**
     * 重写hashCode方法
     */
    @Override
    public int hashCode() {        
        return ID;
    }
    
    /**
     * 重写equals方法,必须在执行hashCode方法得到相同哈希值之后才进入该方法
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (ID != other.ID)
            return false;
        return true;
    }

    习题:已知ArrayList集合s1, 现要实现将s1中重复的元素移除

    方法1:

    HashSet<String> s2 = new HashSet<String>(s1);

    方法2:

    HashSet<String> s2 = new HashSet<String>();
    s2.addAll(s1);

    方法3:

    HashSet<String> s2 = new HashSet<String>();
    for (String string : s1) {
        s2.add(string);
    }

    2、TreeSet

    TreeSet使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。

    构造方法

    TreeSet(Collection<? extends E> c)

    构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。

    TreeSet(Comparator<? super E> comparator)

    构造一个新的空 TreeSet,它根据指定比较器进行排序。该比较器为实现了Comparator接口的类的实体对象。

    自然顺序的规则

    TreeSet使用的元素的自然顺序由元素自己提供比较规则。

    通常这个比较规则有两种实现方法:

    • 元素对象实现Comparable接口,并实现接口的CompareTo方法
    • TreeSet在实例化的时候传入一个该元素对象的比较器,该比较器实现了Comparator接口,并实现接口的compare方法

    实现Comparable接口:

    public class Student implements Comparable<Student>{
    
    ...
    /** * 重写Comparable接口的compareTo方法,将o的name属性与本对象的name属性对比 */ @Override public int compareTo(Student o) { return name.compareTo(o.name); }

    传入比较器:

    比较器类

    public class MyComparator implements Comparator<Student>{
    
        @Override
        public int compare(Student o1, Student o2) {        
            return o1.getAge() - o2.getAge();
        }
    
    }

    构造方法

    HashSet<Student> stuList = new HashSet<Student>(new MyComparator());

    练习:使用TreeSet对存储字符串并根据字符串长度排序

    代码实现:

    public static void main(String[] args) {
        //实例化TreeSet,并通过匿名类传入比较器
        TreeSet<String> tSet = new TreeSet<String>(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {                
                    return o2.length() - o1.length();
                }                
            }
        );
        
        tSet.add("asd");
        tSet.add("asd1");
        tSet.add("asd111");
        tSet.add("asd11");
        
        System.out.println(tSet);
    
    }

    打印结果:

    [asd111, asd11, asd1, asd]
  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/JuanF/p/9326776.html
Copyright © 2011-2022 走看看