2013-03-07 59 views
1

我正在爲小型企業創建一些圖形軟件。他們去年向我彙報了他們的銷售情況,並在這份報告中顯示了每個特定銷售的「時間戳」和項目或「sku」,但沒有特定的順序。我想知道在特定的日子裏每件物品有多少。我知道我想使用地圖,但我不太熟悉在這種情況下如何使用它。我還需要地圖返回0,如果一個sku在特定的日子賣出0件物品。這很難,因爲我不知道報告中會有多少skus,報告也沒有特別的順序。具有多個鍵的Java地圖,並將其計爲值

例如,報告可能顯示:

sku="AKD123"; timestamp="2012-02-01"; 
sku="AKD123"; timestamp="2012-04-14"; 
sku="REN134"; timestamp="2012-02-01"; 
sku="PIK383"; timestamp="2012-10-07"; 
sku="REN134"; timestamp="2012-02-01"; 
sku="REN134"; timestamp="2012-02-01"; 
sku="PIK383"; timestamp="2012-03-01"; 
sku="REN134"; timestamp="2012-02-01"; 

我怎麼想有一個地圖,我可以檢查有多少「REN134」的「2012-02-01」出售給希望得到的回報4.

我希望我已經夠清楚了。 謝謝!

+7

您是否考慮過使用數據庫?將這些信息粘貼在表格中可以使您獲得想要的計數。 – David 2013-03-07 20:46:38

+0

查看Apache Commons Collections [MultiValueMap](http://commons.apache.org/proper/commons-collections//javadocs/api-release/org/apache/commons/collections/map/MultiValueMap.html) – Grim 2013-03-07 20:52:58

回答

3

你需要兩個地圖,一個匹配一個sku一些日期和數量,以及每個日期映射到一個計數一個......嘗試......

final static String skus[] = { 
    "AKD123", 
    "AKD123", 
    "REN134", 
    "PIK383", 
    "REN134", 
    "REN134", 
    "PIK383", 
    "REN134" 
}; 

final static String timestamp[] = { 
    "2012-02-01", 
    "2012-04-14", 
    "2012-02-01", 
    "2012-10-07", 
    "2012-02-01", 
    "2012-02-01", 
    "2012-03-01", 
    "2012-02-01" 
}; 


@Test 
public void countSkusPerDay() { 
    Map<String, Map<String, Integer>> countMap = new HashMap<>(); 
    for(int i = 0; i < skus.length; i++) { 
     String sku = skus[i]; 
     String date = timestamp[i]; 
     Map<String, Integer> countPerDateMap = countMap.get(sku); 
     if(countPerDateMap == null) { 
      countPerDateMap = new HashMap<>(); 
      countMap.put(sku, countPerDateMap); 
     } 
     Integer count = countPerDateMap.get(date); 
     if(count == null) { 
      countPerDateMap.put(date, 1); 
     } else { 
      countPerDateMap.put(date, count.intValue() + 1); 
     } 
    } 

    for(Map.Entry<String, Map<String, Integer>> e : countMap.entrySet()) { 
     System.out.println("sku " + e.getKey() + " sold in " + e.getValue().size() + " day(s) " + e.getValue()); 
    } 
} 

輸出是

sku REN134 sold in 1 day(s) {2012-02-01=4} 
sku PIK383 sold in 2 day(s) {2012-10-07=1, 2012-03-01=1} 
sku AKD123 sold in 2 day(s) {2012-02-01=1, 2012-04-14=1} 
+0

好的答案再次:) – 2013-03-08 18:50:38

3

地圖不能有重複的鍵。你需要做的是有一個HashMap<String, ArrayList<String>>或類似的東西,其中關鍵是SKU編號,值是一個所有日期列表,然後你可以使用它進一步分類和處理來計算出現次數。

+0

也許地圖<字符串,地圖<日期,整數>>也可能有用 - 內部地圖是從日期到數量的地圖。 – 2013-03-07 20:48:39

+0

當然,您可以通過嵌套地圖進行「更深入」來始終存儲更多關聯信息。很好的建議,取決於OP想要得到多少複雜以及是否需要考慮可讀性(我個人發現很多嵌套地圖有點混淆,但這只是我)。 – asteri 2013-03-07 20:49:40

0

創建您自己的Item類來封裝skutimestamp字段。實施hashCodeequals方法,以便HashMap可以正常工作。

創建您的地圖。

Map<Item, Integer> salesMap = new HashMap<Item, Integer>(); 

您需要初始化值爲0的地圖,以便稍後可以獲得哪些項目在一天內沒有銷售。

從報告中讀取數據並創建您的Item對象。如果地圖中尚不存在,則將其存儲在地圖中,值爲1.如果它存在,則取存儲的值,加1,並存儲新值。

1

考慮這個代碼(我已經添加了您的樣本數據)...的事實,其採取優勢Map中不能有重複鍵:

import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 

public class TEST 
{ 
    public static void main(String[] args) 
    { 
/* 
sku="AKD123"; timestamp="2012-02-01"; 
sku="AKD123"; timestamp="2012-04-14"; 
sku="REN134"; timestamp="2012-02-01"; 
sku="PIK383"; timestamp="2012-10-07"; 
sku="REN134"; timestamp="2012-02-01"; 
sku="REN134"; timestamp="2012-02-01"; 
sku="PIK383"; timestamp="2012-03-01"; 
sku="REN134"; timestamp="2012-02-01"; 

    Transform into this array: 
*/ 
    String[] inputValues = new String[] 
    { "AKD123|2012-02-01", "AKD123|2012-04-14", "REN134|2012-02-01", "PIK383|2012-10-07", "REN134|2012-02-01", "REN134|2012-02-01", 
     "PIK383|2012-03-01", "REN134|2012-02-01" }; 

    // That is your map 
    Map<String, Integer> mapCouter = new HashMap<String, Integer>(); 
    // now iterate though all SKU sales 
    for (String key : inputValues) 
    { 
     Integer count = mapCouter.get(key); 
     if (count == null) 
     { 
     // not found... lets init. 
     count = 0; // using java autoboxing. 
     } 
     mapCouter.put(key, ++count); // incrementing by 1 before storing in the Map 
    } 
    System.out.println("Report:"); 
    Set<String> keys = mapCouter.keySet(); 
    for (String key : keys) 
    { 
     System.out.println("key: " + key + " has " + mapCouter.get(key) + " occurences."); 
    } 
    } 
} 

它產生下面的輸出:

Report: 
key: REN134|2012-02-01 has 4 occurences. 
key: AKD123|2012-04-14 has 1 occurences. 
key: PIK383|2012-10-07 has 1 occurences. 
key: AKD123|2012-02-01 has 1 occurences. 
key: PIK383|2012-03-01 has 1 occurences. 

注:您將需要通過輸入文件來分析(因爲它可能是大數據),並使用此顯示「地圖計數器」技術。

0

什麼有地圖的Guava MultisetsMap<String,Multiset<String>> itemToDatesSoldMap = new HashMap<>();一個。這將允許我們做類似於

public int countSalesOfItemOnDate(String sku, String timestamp){ 
    Multiset<String> timestampMultiset = itemToDatesSoldMap.get(sku); 
    if(timestampMultiset == null){ 
     return 0; 
    } 
    return timestampMultiset.count(timestamp); 
} 

countSalesOfItemOnDate("REN134","2012-02-01"); 
相關問題