Java 集合练习(购物小票 1)

OOP h11

字符串 content 是一个超市的历次购物小票的合计,每次购物的明细之间用分号分割,每个商品之间用半角逗号分开

请找出哪两个商品被同时购买的频率最高,将这 2 个商品名称返回,名称之间用逗号分隔

测试的时候,商品名称可能增加新的商品,例如方便面、面包…

@param content 历次购物的明细,例如:炸鸡,可乐,啤酒;薯片,啤酒,炸鸡;啤酒,雪碧,炸鸡

@return 哪两个商品被同时购买的频率最高,将这 2 个商品名称返回,名称之间用逗号分隔

和前面的练习 getFrequentWord 类似,找到两个同时购买频率最高的商品,就是把每次购物的商品两两组合,最终将所有购物商品的二元组作为键存放在一个映射表中,用值代表出现的次数。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.huawei.classroom.student.h11;

import java.util.*;

/**
* @author super
*/
public class Home11 {

public Home11() {
// TODO Auto-generated constructor stub
}


/**
* 字符串content是一个超市的历次购物小票的合计,每次购物的明细之间用分号分割,每个商品之间用半角逗号分开
* 请找出 哪两个商品被同时购买的频率最高,将这2个商品名称返回,名称之间用逗号分隔
* 测试的时候,商品名称可能增加新的商品,例如方便面、面包...
* @param content 历次购物的明细,例如:炸鸡,可乐,啤酒;薯片,啤酒,炸鸡;啤酒,雪碧,炸鸡
* @return 哪两个商品被同时购买的频率最高,将这2个商品名称返回,名称之间用逗号分隔
*/
public String getFrequentItem(String content) {
int i, j, k, max;
String[] shopping;
String[] items;
HashSet<String> doubleItemsAns;
HashMap<HashSet<String>, Integer> doubleItemsMap;
Set<HashSet<String>> doubleItemsSet;
String ans;

shopping = content.split(";");// 分隔字符串,得到每次购物的商品
doubleItemsMap = new HashMap<>();
for (i = 0; i < shopping.length; i++) {// 遍历购物次数
items = shopping[i].split(",");// 对于一次购物,分隔得到若干商品
for (j = 0; j < items.length - 1; j++) {
for (k = 1; k < items.length; k++) {// 两层循环遍历商品,得到二元组
if (items[j].equals(items[k])) {// 若出现相同的两种商品,跳过
continue;
}
HashSet<String> doubleItems = new HashSet<>(2);// 无法得知两种商品的顺序,故用集合存储
doubleItems.add(items[j]);
doubleItems.add(items[k]);// 存储两个商品
if (!doubleItemsMap.containsKey(doubleItems)) {
doubleItemsMap.put(doubleItems, 1);// 没存过,出现次数为1
} else {
doubleItemsMap.put(doubleItems, doubleItemsMap.get(doubleItems) + 1);// 存过,出现次数加1
}
}
}
}

max = 0;
doubleItemsAns = new HashSet<>(2);
doubleItemsSet = doubleItemsMap.keySet();// 取键,即商品二元组
for (HashSet<String> doubleItem: doubleItemsSet) {// 遍历映射,找值的最大值
if (max < doubleItemsMap.get(doubleItem)) {
max = doubleItemsMap.get(doubleItem);
doubleItemsAns = doubleItem;// 找到后,赋值给ans
}
}

items = doubleItemsAns.toArray(new String[0]);// 集合转数组,注意“类型转换”
ans = items[0] + "," + items[1];// 组合得到结果,不分顺序
return ans;
}


}