EnumSet在处理枚举类数据时,非常不错,
package com.ghw.springboot.A0218;
/**
* 周一到周日
*/
public enum Day {
周一, 周二, 周三, 周四, 周五, 周六, 周天
}
package com.ghw.springboot.A0218;
import java.util.Set;
public class Worker {
private String name;
private Set<Day> workDays;
public Worker() {
}
public Worker(String name, Set<Day> workDays) {
this.name = name;
this.workDays = workDays;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Day> getWorkDays() {
return workDays;
}
public void setWorkDays(Set<Day> workDays) {
this.workDays = workDays;
}
@Override
public String toString() {
return "Worker{" +
"name='" + name + '\'' +
", workDays=" + workDays +
'}';
}
}
package com.ghw.springboot.A0218;
import java.util.*;
import static com.ghw.springboot.A0218.Day.*;
public class Test {
public static void main(String[] args) {
Worker[] workers = new Worker[]{
new Worker("张三", EnumSet.of(周一, 周二, 周三, 周五)),
new Worker("李四", EnumSet.of(周二, 周四, 周六)),
new Worker("王五", EnumSet.of(周二, 周四)),
};
System.out.println(getNoWorkDay(workers) + "无人工作");
System.out.println(getDayLeast1People(workers) + "至少会有一个人来");
System.out.println(getDayLeast2People(workers) + "至少会有两个人来");
System.out.println(getPeopleWorkOnMonAndTue(workers) + "周一和周二都会来");
}
/**
* 问题1:哪一天没有人工作,思路,先把周一-周天 加入Set,然后遍历工人,将工人工作的天移除出去,剩下的就是无人工作日
*
* @param workers 工人集合
* @return 日期集合
*/
private static Set<Day> getNoWorkDay(Worker[] workers) {
Set<Day> noWorkDays = EnumSet.allOf(Day.class);
for (Worker worker : workers) {
noWorkDays.removeAll(worker.getWorkDays());
}
return noWorkDays;
}
/**
* 问题2:有哪些天至少会有一个人来?
*
* @param workers 工人集合
* @return 日期集合
*/
private static Set<Day> getDayLeast1People(Worker[] workers) {
Set<Day> leastOnePeopleDays = EnumSet.noneOf(Day.class);
for (Worker worker : workers) {
leastOnePeopleDays.addAll(worker.getWorkDays());
}
return leastOnePeopleDays;
}
/**
* 问题3:有哪些天至少会有两个人来?
* 疑惑:这个问题用平台的HashSet也可以,但是用EnumSet效率高,是元操作 。
*
* @param workers 工人集合
* @return 日期集合
*/
private static Set<Day> getDayLeast2People(Worker[] workers) {
Set<Day> least2PeopleDays = EnumSet.noneOf(Day.class);
Map<Day, Integer> map = new EnumMap<>(Day.class);
for (Worker worker : workers) {
for (Day day : worker.getWorkDays()) {
map.put(day, map.get(day) == null ? 1 : map.get(day) + 1);
}
}
for (Map.Entry<Day, Integer> entry : map.entrySet()) {
if (entry.getValue() >= 2) {
least2PeopleDays.add(entry.getKey());
}
}
return least2PeopleDays;
}
/**
* 问题3:哪些人周一和周二都会来?
*
* @param workers 工人集合
* @return 日期集合
*/
private static Set<String> getPeopleWorkOnMonAndTue(Worker[] workers) {
Set<String> names = new HashSet<>();
for (Worker worker : workers) {
if (worker.getWorkDays().containsAll(EnumSet.of(周一, 周二))) {
names.add(worker.getName());
}
}
return names;
}
}
枚举类练习:
package com.ghw.springboot.A0218;
import static cn.hutool.core.lang.Console.print;
public class EnumClass {
enum Shrubbery {GROUND, CRAWLING, HANGING}
public static void main(String[] args) {
for (Shrubbery s : Shrubbery.values()) {
print(s + " ordinal: " + s.ordinal() + "\n");
print(s.compareTo(Shrubbery.CRAWLING) + " ");
print(s.equals(Shrubbery.CRAWLING) + " ");
print(s == Shrubbery.CRAWLING);
print("\n" + s.getDeclaringClass());
print("\n" + s.name());
print("\n-------------------\n");
}
for (String s : "GROUND CRAWLING HANGING".split(" ")) {
System.out.println(Enum.valueOf(Shrubbery.class, s));
Shrubbery shrubbery = Shrubbery.valueOf(s);
print(shrubbery + "\n");
}
}
}