一、实验目的
熟悉Eclipse;
熟悉Java中Set/Map/List File的使用;
二、实验内容
字符串content是一个超市的历次购物小票的合计,每次购物的明细之间用分号分割,每个商品之间用半角逗号分开。请开发程序完成如下功能:
找出哪两个商品总被同时购买的频率最高(不考虑商品的先后顺序);
找出哪N个商品(N=2)总被同时购买的频率最高。(选做)
三、代码实现
思路分析:首先每次购物明细之间是用分号分隔的,所以先定义allPairMap(Map类型),将每次购物明细划分出来;然后针对每次的购物明细,定义uniqueProducts(Set类型)选取其中所有的商品(不重复),然后定义一个双重循环,将所有可能的Pair都从uniqueProducts选取出来,按照两个词的字典顺序排列,然后加入到allPairMap,最后通过entrySet遍历allPairMap类选取其中出现频率最高的pair
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public String getFrequentItem(String content) { String[] sessions = content.split(";"); Map<String, Integer> allPairMap = new HashMap<>(); for(String session: sessions) { String[] products = session.split(","); Set<String> uniqueProducts = new HashSet<>(); for(String product : products) { uniqueProducts.add(product.trim()); } for(String first : uniqueProducts) { for(String second : uniqueProducts) { if(!first.equals(second)) { String pair = first.compareTo(second) < 0 ? first + "," + second : second + "," + first; allPairMap.put(pair,allPairMap.getOrDefault(pair, 0)+1); } } } } String maxFrequentPair = null; int maxFrequentCount = 0; for(Map.Entry<String, Integer> entry: allPairMap.entrySet()) { if(maxFrequentCount < entry.getValue()) { maxFrequentCount = entry.getValue(); maxFrequentPair = entry.getKey(); } } return maxFrequentPair; }
|
注意其中的compareTo函数是自带的,按照字典顺序排列
getOrDefault函数可以获取当前key的value,如果没有这个key,则返回0(默认值)
四、实验结果
image-20240416203230441
五、实验总结
本次实验是对Map和Set的总和考察,其中一些小小的细节能够提升代码的可读性和精准性,如CompareTo的使用、getOrDefault函数的使用等等。