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
网友评论