一、实验目的

熟悉Eclipse;

熟悉Java中Set/Map/List File的使用;

二、实验内容

字符串content是一个超市的历次购物小票的合计,每次购物的明细之间用分号分割,每个商品之间用半角逗号分开。请开发程序完成如下功能:

  1. 找出哪两个商品总被同时购买的频率最高(不考虑商品的先后顺序);

  2. 找出哪N个商品(N=2)总被同时购买的频率最高。(选做)

三、代码实现

思路分析:首先每次购物明细之间是用分号分隔的,所以先定义allPairMap(Map类型),将每次购物明细划分出来;然后针对每次的购物明细,定义uniqueProducts(Set类型)选取其中所有的商品(不重复),然后定义一个双重循环,将所有可能的Pair都从uniqueProducts选取出来,按照两个词的字典顺序排列,然后加入到allPairMap,最后通过entrySet遍历allPairMap类选取其中出现频率最高的pair

代码如下:

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.png

五、实验总结

本次实验是对Map和Set的总和考察,其中一些小小的细节能够提升代码的可读性和精准性,如CompareTo的使用、getOrDefault函数的使用等等。