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