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()方法的第二个入口参数。

原文地址:https://www.cnblogs.com/qimengru/p/7645524.html