0%

java程序设计-lab2

一、实验目的

熟悉Eclipse;

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

二、实验内容

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

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

  2. 找出哪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函数的使用等等。

-------------本文结束感谢您的阅读-------------