teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード追加

2016/03/23 08:15

投稿

tkturbo
tkturbo

スコア5572

answer CHANGED
@@ -1,1 +1,72 @@
1
- 「mpDM = alDM.get(itemA[1]);」してるところで商品名を格納したMapを取ろうとしてるのはわかったけど、肝心の商品名を出力するとこ(「Object b = mpDM.get("name"); //商品名」)で同じmpDMを参照してるから同じ商品名が出るのです。
1
+ 「mpDM = alDM.get(itemA[1]);」してるところで商品名を格納したMapを取ろうとしてるのはわかったけど、肝心の商品名を出力するとこ(「Object b = mpDM.get("name"); //商品名」)で同じmpDMを参照してるから同じ商品名が出るのです。
2
+
3
+ 以下追記:
4
+
5
+ 「並べ替えする数字」と「数字と対になる名前」は同じようにソートしてあげないとだめです。
6
+ 金額・個数をセットにしてあれこれするのであれば、下のような独自クラスを作ってあげるのも手。
7
+
8
+ ```
9
+ class Profit {
10
+ /** 商品名 */
11
+ public String itemName = null;
12
+ /** 売上数量 */
13
+ public int count = 0;
14
+ /** 売上金額 */
15
+ public int salesAmount = 0;
16
+ }
17
+
18
+ ```
19
+ これを名前とセットで管理すれば同じように並べ替えができますよ。
20
+
21
+
22
+ ```
23
+ HashMap<String, Profit> totalHolder = null;
24
+ // boolean isFirst = true;
25
+
26
+ while((stA = brA.readLine()) != null){
27
+
28
+ itemA = stA.split(",");
29
+
30
+ if(isFirst){
31
+ date = itemA[0].substring(0, 6);
32
+ isFirst = false;
33
+ }
34
+
35
+ String soldDay = (itemA[0].substring(0, 6));
36
+
37
+ // 月変更の比較
38
+ // 同じ月じゃなかったら今までため込んでた分を並べ替え&出力、でしょ?
39
+ if(soldDay.equals(date) == false){
40
+ // ここで並べ替え&出力:処理が長くなるのでさらに下の方で記述予定
41
+
42
+ // totalHolderの初期化
43
+ totalHolder = null;
44
+ }
45
+
46
+ if(totalHolder == null){
47
+ totalHolder = new HashMap<String, Profit>();
48
+ }
49
+
50
+ mpDM = alDM.get(itemA[1]);
51
+ //↑itemA[1]がなんなのかよくわかりませんが、ともあれこれでマスタが取れましたね。
52
+
53
+ String itemName = mpDM.get("name");
54
+ if(totalHolder.containsKey(itemName == false) { //totalHolderに名前が登録されてなければ新しく登録します。
55
+ totalHolder.put(itemName, new Profit());
56
+ totalHolder.get(itemName).itemName = itemName; // あとで値出力の時に使う
57
+ }
58
+
59
+ // これで数字の加算。
60
+ totalHolder.get(itemName).count +=
61
+ totalHolder.get(itemName).salesAmount +=
62
+
63
+ }
64
+
65
+ ```
66
+ 並べ替えの時にはMap#values()を使うとCollection型ですべての値が取得できるので、これをtoArray()してから並べ替えます。
67
+
68
+ ```
69
+ Profit[] arr = totalHolder.values().toArray(new Profit[]);
70
+
71
+ ```
72
+ 後の並べ替え自体はProfit#salesAmountを比較していけばできますよね?