質問: {amt1,amt2,amt3,amt4,amt5}; //全商品の月の合計数量を格納 if(sold > 0){ bwA.write(date.substring(0, 6) + "月売上高BEST3"); //月売上高BEST3を出力 bwA.newLine(); for(int i=0; i
回答: 「mpDM = alDM.get(itemA[1]);」してるところで商品名を格納したMapを取ろうとしてるのはわかったけど、肝心の商品名を出力するとこ(「Object b = mpDM.get("name"); //商品名」)で同じmpDMを参照してるから同じ商品名が出るのです。 以下追記: 「並べ替えする数字」と「数字と対になる名前」は同じようにソートしてあげないとだめです。 金額・個数をセットにしてあれこれするのであれば、下のような独自クラスを作ってあげるのも手。 ``` class Profit { /** 商品名 */ public String itemName = null; /** 売上数量 */ public int count = 0; /** 売上金額 */ public int salesAmount = 0; } ``` これを名前とセットで管理すれば同じように並べ替えができますよ。 ``` HashMap totalHolder = null; // boolean isFirst = true; while((stA = brA.readLine()) != null){ itemA = stA.split(","); if(isFirst){ date = itemA[0].substring(0, 6); isFirst = false; } String soldDay = (itemA[0].substring(0, 6)); // 月変更の比較 // 同じ月じゃなかったら今までため込んでた分を並べ替え&出力、でしょ? if(soldDay.equals(date) == false){ // ここで並べ替え&出力:処理が長くなるのでさらに下の方で記述予定 // totalHolderの初期化 totalHolder = null; } if(totalHolder == null){ totalHolder = new HashMap(); } mpDM = alDM.get(itemA[1]); //↑itemA[1]がなんなのかよくわかりませんが、ともあれこれでマスタが取れましたね。 String itemName = mpDM.get("name"); if(totalHolder.containsKey(itemName == false) { //totalHolderに名前が登録されてなければ新しく登録します。 totalHolder.put(itemName, new Profit()); totalHolder.get(itemName).itemName = itemName; // あとで値出力の時に使う } // これで数字の加算。 totalHolder.get(itemName).count += totalHolder.get(itemName).salesAmount += } ``` 並べ替えの時にはMap#values()を使うとCollection型ですべての値が取得できるので、これをtoArray()してから並べ替えます。 ``` Profit[] arr = totalHolder.values().toArray(new Profit[]); ``` 後の並べ替え自体はProfit#salesAmountを比較していけばできますよね?