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]
  • 相关阅读:
    Roadblocks(poj 3255)
    最小集合(51nod 1616)
    绿色通道(codevs 3342)
    解的个数(codevs 1213)
    多米诺(codevs 3052)
    abcd
    dwarf tower
    第K 小数
    noip2016复习
    文化之旅(洛谷 1078)
  • 原文地址:https://www.cnblogs.com/JuanF/p/9326776.html
Copyright © 2011-2022 走看看