簡體   English   中英

找出不同的琴弦組合的頻率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM