EnumSet

作者: 蚂蚁绊倒象 | 来源:发表于2019-01-24 18:43 被阅读2次

EnumSet是一个抽象方法,需要通过静态方法创建:

//创建一个指定枚举类型但是数据为空的Set
EnumSet<Date> dates = EnumSet.noneOf(Date.class);
//创建一个拥有Date中所有值的Set
EnumSet<Date> dates1 = EnumSet.allOf(Date.class);
EnumSet<Date> dates2 = EnumSet.complementOf(dates1);
EnumSet<Date> dates3 = EnumSet.copyOf(dates2);

enum Date{
    Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Weekday;
}

EnumSet其它的一些静态工厂方法(省略了修饰public static):

// 初始集合包括指定枚举类型的所有枚举值
<E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)
// 初始集合包括枚举值中指定范围的元素
<E extends Enum<E>> EnumSet<E> range(E from, E to)
// 初始集合包括指定集合的补集
<E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s)
// 初始集合包括参数中的所有元素
<E extends Enum<E>> EnumSet<E> of(E e)
<E extends Enum<E>> EnumSet<E> of(E e1, E e2)
<E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3)
<E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4)
<E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
<E extends Enum<E>> EnumSet<E> of(E first, E... rest)
// 初始集合包括参数容器中的所有元素
<E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s)
<E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c)

应用场景示例:
想象一个场景,在一些工作中,比如医生、客服,不是每个工作人员每天都在的,每个人可工作的时间是不一样的,比如张三可能是周一和周三,李四可能是周四和周六,给定每个人可工作的时间,我们可能有一些问题需要回答,比如:

  • 有没有哪天一个人都不会来?
  • 有哪些天至少会有一个人来?
  • 有哪些天至少会有两个人来?
  • 有哪些天所有人都会来,以便开会?
  • 哪些人周一和周二都会来?
    enum Date {
        Monday, Tuesday, Wednesday, Thursday, 
        Friday, Saturday, Weekday;
    }

    //类说明:表示工作人员
    class Worker {
        String name;
        Set<Date> work_day;

        public Worker(String name, Set<Date> work_day) {
            this.name = name;
            this.work_day = work_day;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Set<Date> getWork_day() {
            return work_day;
        }

        public void setWork_day(Set<Date> work_day) {
            this.work_day = work_day;
        }
    }    
        //所有工作人员和其工作的时间
        Worker[] workers = new Worker[]{
                new Worker("ZhangSan", EnumSet.of(Date.Monday, Date.Tuesday)),
                new Worker("LiSi", EnumSet.of(Date.Monday, Date.Thursday)),
                new Worker("WangWu", EnumSet.of(Date.Monday, Date.Wednesday, Date.Friday))
        };
        //创建一个拥有Date中所有值得Set
        Set<Date> dates = EnumSet.allOf(Date.class);
        for (Worker w : workers) {
            dates.removeAll(w.getWork_day());
        }
        System.out.println("哪些天一个人都不会来:" + dates);
        
        Set<Date> dates1 = EnumSet.noneOf(Date.class);
        for (Worker w : workers) {
            dates1.addAll(w.getWork_day());
        }
        System.out.println("有哪些天至少会有一个人来:" + dates1);
        
        Set<Date> dates2 = EnumSet.allOf(Date.class);
        for (Worker w : workers) {
            dates2.retainAll(w.getWork_day());
        }
        System.out.println("有哪些天所有人都会来:" + dates2);
        
        Map<Date, Integer> countMap = new EnumMap<Date, Integer>(Date.class);
        for (Worker w : workers) {
            for (Date d : w.getWork_day()) {
                Integer count = countMap.get(d);
                countMap.put(d, count == null ? 1 : count + 1);
            }
        }
        EnumSet<Date> dates3 = EnumSet.noneOf(Date.class);
        Set<Map.Entry<Date, Integer>> entries = countMap.entrySet();
        for (Map.Entry<Date, Integer> e : entries) {
            if (e.getValue() >= 2) {
                dates3.add(e.getKey());
            }
        }
        System.out.println("哪些天至少会有两个人来:" + dates3);
        
        Set<Worker> hashSet = new HashSet<>();
        for (Worker w : workers) {
            if (w.getWork_day().containsAll(EnumSet.of(Date.Monday, Date.Tuesday))) {
                hashSet.add(w);//HashSet储存的是唯一的对象,所以不会重复
            }
        }
        for (Worker w : hashSet) {
            System.out.println("哪些人周一和周二都会来:" + w.getName());
        }

打印信息:

I/System.out: 哪些天一个人都不会来:[Saturday, Weekday]
I/System.out: 有哪些天至少会有一个人来:[Monday, Tuesday, Wednesday, Thursday, Friday]
I/System.out: 有哪些天所有人都会来:[Monday]
I/System.out: 哪些天至少会有两个人来:[Monday]
I/System.out: 哪些人周一和周二都会来:ZhangSan

转自:https://blog.csdn.net/tugangkai/article/details/79509067

相关文章

网友评论

      本文标题:EnumSet

      本文链接:https://www.haomeiwen.com/subject/ouuujqtx.html