• Set集合


    set集合中的对象不按特定的方式排序,只是简单的把对象加入集合中,但set集合中不能包含重复对象。set集合由set接口和set接口的实现类组成。set接口继承了collection接口,因此包含collection接口的所有方法。

    注意:set的构造有一个约束条件,传入的Collection对象不能有重复的值。

    set接口常用的实现类有HashSet类和TreeSet类

    • HashSet类实现set接口,由哈希表(实际上是一个HashMap实例)支持。他不保证Set的迭代顺序,特别是它不保证顺序恒久不变。此类允许使用null元素。
    • TreeSet类不仅实现了set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增顺序,即可以可以通过比较器对用TreeSet类实现Set集合中的对象进行排序。TreeSet类新增的方法如下:
    方法  功能描述
    first() 返回此Set中当前第一个(最低)元素
    last() 返回此Set中当前最后一个(最高)元素
    comparator() 返回对此Set中的元素进行排序的比较器,如果此Set使用自然顺序,则返回null
    headSet() 返回一个新的Set集合,新集合时 toElement(不包含)之前的所有对象

    subSet(E fromElement,

    E fromElement)

    返回一个新的set集合,fromElement(包含)对象与fromElement(不包含)对象之间的所有对象
    tailSet(E fromElement) 返回一个新的set集合,新集合包含对象fromElement(包含)之后的所有对象

    在项目中创建类Demo ,实现Comparable接口,重写该接口的compareTo()方法,在主方法中创建Demo对象,创建集合,并将Demo对象添加到集合中,遍历该集合中的全部元素,以及通过headSet(),subSet()方法获得的部分集合

    import java.util.Iterator;
    import java.util.TreeSet;
    
    public class Demo implements Comparable<Object> {// 创建类实现Comparable接口
    
        String name;
        long id;
    
        public Demo(String name, long id) {
            this.id = id;
            this.name = name;
        }
    
        @Override
        public int compareTo(Object o) {
    
            Demo demo = (Demo) o;
            int result = id > demo.id ? 1 : (id == demo.id ? 0 : -1);// 参照代码说明
            return result;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public static void main(String[] args) {
            Demo demo1 = new Demo("tom", 010111);
            Demo demo2 = new Demo("Jack", 020222);// 创建demo对象
            Demo demo3 = new Demo("lucky", 030333);
            Demo demo4 = new Demo("duvk", 040444);
    
            TreeSet<Demo> tree = new TreeSet<>();
            tree.add(demo1); // 向集合中添加对象
            tree.add(demo2);
            tree.add(demo3);
            tree.add(demo4);
    
            Iterator<Demo> it = tree.iterator();// set集合中的所有对象的迭代器
            System.out.println("Set集合中的所有元素:");
            while (it.hasNext()) {// 遍历集合
                Demo demo = (Demo) it.next();
                System.out.println(demo.getId() + " " + demo.getName());
            }
            it = tree.headSet(demo2).iterator();// 截取排在demo2对象之前的对象
            System.out.println("截取前面部分的集合:");
            while (it.hasNext()) {// 遍历集合
                Demo demo = it.next();
                System.out.println(demo.getName() + demo.getId());
            }
            it = tree.subSet(demo2, demo3).iterator();// 截取demo2 demo3之间的对象
            System.out.println("截取中间部分的集合:");
            while (it.hasNext()) {
                Demo demo = it.next();
                System.out.println(demo.getName() + " " + demo.getId());
            }
        }
    
    }

    运行结果

    代码说明:

    存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序。如果该对象小于,等于,或大于指定对象,则分别返回负整数,0或正整数。

    技巧:

    headSet(),subSet(),tailSet()方法截取对象生成新集合时是否包含指定的参数,可以通过如下方法判别:如果指定参数位于新集合的起始位置,则包含该对象,如:subSet()方法的第一个参数和tailSet()方法的参数;如果指定参数是新集合的终止位置,则不包含该参数,如headSet()方法的入口参数和subSet()方法的第二个入口参数。

  • 相关阅读:
    (DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device【转】
    Linux 内核虚拟地址到物理地址转换讨论【转】
    【Go命令教程】6. go doc 与 godoc
    【Go命令教程】5. go clean
    【Go命令教程】4. go get
    PHP项目收藏
    【Go命令教程】3. go install
    分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验
    【Go命令教程】2. go build
    【Go命令教程】1. 标准命令详解
  • 原文地址:https://www.cnblogs.com/qimengru/p/7645524.html
Copyright © 2020-2023  润新知