1

中小企業向けのグラフ作成ソフトウェアの作成に取り組んでいます。彼らは昨年の販売レポートを私にくれました。このレポートには、特定の販売ごとに「タイムスタンプ」とアイテムまたは「sku」が示されていますが、順不同です。特定の日に各商品が何個売れたかを計算するとします。map を使用することになっていることは知っていますが、この場合の使用方法にはあまり慣れていません。また、特定の日に 0 アイテムが販売された SKU の場合、マップが 0 を返すようにする必要もあります。レポートにいくつの SKU があるかわかりませんし、レポートは特定の順序ではないため、これは困難です。

たとえば、レポートには次のように表示されます。

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";

「2012-02-01」に「REN134」が何個売れて、うまくいけば 4 個の収益が得られるかを確認できるマップを作成するにはどうすればよいでしょうか。

私が十分に明確であることを願っています。ありがとう!

4

5 に答える 5

3

2 つのマップが必要です。1 つは 1 つskuをいくつかの日付とカウントに一致させるもので、もう 1 つは各日付をカウントにマップするものです ... これを試してください ...

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}
于 2013-03-07T21:11:44.640 に答える
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.

注:入力ファイルを解析して (ビッグ データである可能性があるため)、この「マップ カウンター」手法を使用する必要があります。

于 2013-03-07T21:03:22.763 に答える
0

のようなGuava Multisetsのマップを持つことはどうですかMap<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");
于 2013-03-07T21:14:10.020 に答える
0

およびフィールドItemをカプセル化する独自のクラスを作成します。およびメソッドを実装して、後で aが適切に機能するようにします。skutimestamphashCodeequalsHashMap

マップを作成します。

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

マップを値 0 で初期化して、1 日に売れなかった商品を後で取得できるようにする必要があります。

レポートからデータを読み取り、Itemオブジェクトを作成します。マップにまだ存在しない場合は、値 1 でマップに保存します。存在する場合は、保存された値を取得し、1 を追加して、新しい値を保存します。

于 2013-03-07T20:50:52.067 に答える