[英]Finding the frequency of distinct combination of strings
我試圖找到HashMap中字符串的不同組合的頻率。 例如,假設我們的人有各種各樣的購物清單。 我們將每個購物清單存儲在string類型的ArrayList中,並將其映射到一個人的名字。 然后,我們將得到以下內容:
{Megan=[Skim milk, Bananas, eggs, butter],
Neal=[Bananas, butter, Whole Milk, Pork Chops],
Ash=[Pork Loin, Pork Chops, Skim Milk, butter],
Amanda=[Skim milk, strawberries],
John=[Whole Milk, eggs, bananas]}.
假設我將這些值存儲在稱為map的HashMap中。 因此,將兩者結合起來,這是我到目前為止嘗試過的:
HashMap<ArrayList<String>, Integer> frequencies = new HashMap<>();
// ......
// Initialize the frequency map ..
//....
public void getMostCommon() {
boolean hasElements;
for (String person : map.keySet()) {
Collections.sort(map.get(person));
ArrayList<String> input = map.get(person);
//Iterate over each list entry
for (Map.Entry<String, ArrayList<String>> listEntry : map.entrySet()) {
ArrayList<String> tempList = listEntry.getValue();
ArrayList<String> matchingElem = getMatchingElements(input, tempList);
hasElements = (temp != null);
//Count frequency
if (freq.containsKey(temp)) {
if (hasElements) {
freq.put(temp, freq.get(temp)+1);
}
} else {
if (hasElements) {
freq.put(temp, 1);
}
}
}
}
System.out.println(freq.toString());
}
我使用一個輔助函數來檢查是否有匹配的元素。 這里是:
public ArrayList<String> getMatchingElements(ArrayList<String> a,
ArrayList<String> b) {
ArrayList<String> retVal = new ArrayList<>();
if (a.size() >= b.size()) {
for (int i=0; i < a.size(); i++) {
for (int j=0; j < b.size(); j++) {
if (a.get(i).contains(b.get(j))) {
retVal.add(b.get(j));
}
}
}
} else {
for (int i=0; i < b.size(); i++) {
for (int j=0; j < a.size(); j++) {
if (b.get(i).contains(a.get(j))) {
retVal.add(a.get(j));
}
}
}
}
return retVal;
}
這里的問題是我沒有獲得正確的頻率編號。 我相信是因為將一個靜態字段用於比較(第一個輸入),並將其與從entrySet中獲取的tempList進行比較。 我認為這里有重復計算,但我不知道如何解決此問題。 我希望最終輸出存儲所有頻率大於0的n項的最常見計數。諸如此類的東西是[Skim Milk,Banana],[Eggs,Bananas]等的頻率。我該如何處理這個問題?
編輯:改寫問題/目標。
您正在使它變得更復雜,然后就需要變得更復雜。 您需要做的就是創建另一個地圖,在該地圖上您將擁有一個購物清單項目作為String鍵,並且Integer值將是您遇到購物清單項目的次數。 一開始它將是空的。
然后,您遍歷每個用戶的原始地圖,並遍歷他們的列表。 對於列表中的每個項目,您將檢查它是否在新地圖中。 如果不存在,則將其添加為新鍵,並將值設置為1。如果存在,則只需將值增加1。
完成后,您將獲得一張購物清單項目的地圖,該地圖映射到在所有購物者列表中被提及的次數。
Map<String, Integer> result = new HashMap<>();
for(String shopper : shppersListMap) {
List<String> shoppingList = shppersListMap.get(shopper);
for(String item : shoppingList) {
if(reasult.containsKey(item)) {
result.put(item, result.get(item) + 1);
} else {
result.put(item, 1);
}
}
}
return result;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.