题目:
有一个记事本,能记录周一到周天,每天做的所有事情和事情的次数,周而复始。小明在这个记事本上记录了3周,内容如下:
第一周
·周一:学java,逛街
·周二:打台球,旅游
·周三:溜冰,吃烧烤
·周四:打篮球,逛街,吃烧烤
·周五:学前端,溜冰
·周六:逛街,吃烧烤
·周天:旅游,打台球
第二周:
·周一:学java,学前端
·周二:打台球,溜冰,学java
·周三:旅游,吃烧烤
·周四:逛街,学java
·周五:学前端,旅游
·周六:逛街,打台球,吃烧烤
·周天:旅游,逛街,打台球,吃烧烤
·第三周:
·周一:学java,学前端,学python
·周二:打台球,溜冰,学java,学C++
·周三:旅游,吃烧烤,吃冰淇淋
·周四:逛街,学java,吃烧烤
·周五:学前端,旅游,打高尔夫
·周六:逛街,打台球,吃烧烤,溜冰,蹦迪
·周天:旅游,逛街,打台球,吃烧烤,跑步
使用Scanner接收小明3周所做的所有事情,并存入相应的集合中。然后输出周一到周五(不区分第几周)小明所做的所有事情以及相应的次数。(要求:所选的集合都要用泛型进行约束。)
方法一(使用集合嵌套):
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//创建嵌套集合
TreeMap<String, Map<String, Integer>> week = new TreeMap<>();
//数据录入
for (int i = 1; i <= 3; i++) {//外层for循环代表周次
System.out.println("第" + i + "周:");
HashMap<String, Integer> map;
for (int j = 1; j <= 7; j++) {//内层for循环代表星期几
map = new HashMap<>();//每天都会清空昨天的事情和次数
System.out.print("周" + j + ":");
String things = sc.next();//旅游,逛街,打台球,吃烧烤,跑步等
String[] things_arr = things.split(",");//用逗号切割字符串,再存入map
for (String s : things_arr) {
//map存入的是:事情和次数
map.put(s, map.containsKey(s) ? map.get(s) + 1 : 1);
}
//将map存入week集合,第一次直接存入,后面存入的是新旧结合后的map
if (week.containsKey("周" + j)) {
Map<String, Integer> map1 = week.get("周" + j);
//新旧map按如下方式结合
Set<String> keys = map.keySet();
for (String key : keys) {
if (map1.containsKey(key)) {
map1.put(key, map1.get(key) + map.get(key));
} else {
map1.put(key, map.get(key));
}
}
} else {
week.put("周" + j, map);
}
}
}
//数据输出 week 遍历键值对
Set<Map.Entry<String, Map<String, Integer>>> weeks = week.entrySet();
for (Map.Entry<String, Map<String, Integer>> week1 : weeks) {
System.out.println(week1.getKey() + ":");
Map<String, Integer> map = week1.getValue();
//里面的 map 也遍历键值对
Set<Map.Entry<String, Integer>> things = map.entrySet();
for (Map.Entry<String, Integer> thing : things) {
String key = thing.getKey();
Integer count = thing.getValue();
System.out.print(key + "--" + count + "次 \t");
}
System.out.println();//换行
}
}
}
结果:
方法一(不使用集合嵌套):
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
TreeMap<String, String> wt = new TreeMap<>();// 创建 星期-事件 键值对的map集合
TreeMap<String, Integer> tt = new TreeMap<>();// 创建 事件-次数 键值对的map集合
TreeMap<Integer, String> w = new TreeMap<>();// 创建 序号-星期 键值对的map集合,并将一周七天添加进来
w.put(1, "周一");
w.put(2, "周二");
w.put(3, "周三");
w.put(4, "周四");
w.put(5, "周五");
w.put(6, "周六");
w.put(7, "周天");
// 数据输入
for (int i = 1; i <= 3; i++) {// 外层for表示周次
System.out.println("\t第" + i + "周:");
for (int j = 1; j <= 7; j++) {// 内层for表示星期几
String strw = w.get(j);// 由序号-星期 键值对的map集合 得到星期的字符串
System.out.print(strw + ":");
String str = sc.next();// 由输入得到事件的总字符串
// 第一次将事件字符串直接添加,后面则与原事件字符串进行拼接后添加
if (wt.containsKey(strw)) {
wt.put(strw, wt.get(strw) + "," + str);
} else {
wt.put(strw, str);
}
}
}
// 结果输出
for (int i = 1; i <= 7; i++) {// 循环每周七天,每天分别输出
// 调取该星期的事件总字符串,由事件总字符串获得对应的 事件-次数 键值对的map集合
String strw = w.get(i);
for (String s : wt.get(strw).split(",")) {
if (tt.containsKey(s))
tt.replace(s, tt.get(s) + 1);
else
tt.put(s, 1);
}
// 根据 事件-次数 键值对的map集合 进行输出
System.out.print("\n" + strw + "做的事:");
Set keys = tt.keySet();
for (Object key : keys) {
System.out.print(key + "(" + tt.get(key) + "次)" + ",");
}
tt.clear();// 每星期输出完毕后,都清空 事件-次数 键值对的map集合,方便后续输出
}
}
结果: