質問: 0; } ```
回答: class MonthlySalesBest3内、メソッドsortAmountでのif文「if(arr[i] < arr[j]){」←arr[i]はProfitクラスのインスタンスです。 クラスのインスタンスどうしなのでこれでは比較ができません。 class Profitで**比較するのに使う**のはなんでしたっけ? **売上金額**ではないですか? ``` class Profit { /** 商品名 */ public String itemName = null; /** 売上数量 */ public int count = 0; /** 売上金額 */ public int salesAmount = 0; // <- これで比較するんじゃね? } ``` ではsalesAmountを取ってくるにはどうすればいいでしょう? インスタンスのpublicなメンバ変数にアクセスするには「[インスタンス名].[メンバ変数名]」です。 arr[i]のsalesAmountにアクセスするなら「arr[i].salesAmount」としなければ。 これをほかの売上金額と比較するんでしょ? 「if ( 1 < 2 )」の1、2に該当するところに「arr[i].salesAmount」などなどを入れるのです。 ついでに、 ``` /** * 売上金額の上位3位を出力するメソッド */ public static void outputBest3(){ for(int i=0; i < 3; i++){ String name = totalHolder.get(itemName).itemName[i]; //商品名 int cnt = totalHolder.get(itemName).count[i]; //数量 int amt = totalHolder.get(itemName).salesAmount[i]; //合計額 bwA.write(name + "," + cnt + "," + amt + ","); bwA.newLine(); } } ``` ↑これは何をしているのでしょう? 「totalHolder」はstatic なHashMapなはずです。 > > totalHolder.get(itemName).salesAmount[i]; //合計額 > > > ↑こんなんしてもコンパイルエラーになりますよ? ■以下追加: ``` for(Entry entry : totalHolder.entrySet()) { //System.out.println(entry.getKey() + " ," + entry.getValue().count + " ," + entry.getValue().salesAmount); arr = totalHolder.values().toArray(new Profit[i]); //System.out.println(arr[i]); i += 1; } ``` まずここ。 **無意味なループ**です。 ここでやりたいことは **・「Profit[] arr = null;」で宣言したProfitインスタンスの配列にHashMapの中身を詰め込む。** ことですね。 ``` arr = totalHolder.values().toArray(new Profit[]); ``` この1行で完了します。 また、 ``` /** * 売上金額を大きい順に並べ替えるメソッド */ sortAmount(arr); ``` ここではメソッドにProfit配列を渡して処理してもらってますね? これと同じように、出力するメソッドも ``` /** * 売上金額の上位3位を出力するメソッド */ public static void outputBest3(Profit[] arr){ ``` のように定義してやって、このメソッドにソートが終わった配列を渡してあげれば完了ではありませんか? ``` // outputBest3の実行 outputBest3(arr); ``` まとめ: こんな書き方になるはずです。 ``` if(sold > 0){ // 1.新しい月の売上が出てきたので、今までの分を出力 // 2.処理対象の月のヘッダを出力する bwA.write(date.substring(0, 6) + "月売上高BEST3"); bwA.newLine(); // 3.Profitインスタンスの配列にHashMapの中身を詰め込む arr = totalHolder.values().toArray(new Profit[]); // 4.上で取得したProfit配列を売上金額が大きい順に並べ替える sortAmount(arr); // 5.売上金額の上位3位を出力する outputBest3(arr); date = itemA[0]; //売上日を再セット } ``` **「何を」「どうする」**というのがしっかり切り分けられないとプログラムになりません。(この場合の主語は「プログラムが」) このことが明確になってないとプログラムはおかしくなります。 たとえば質問のソースで ``` // 商品マスタ一覧を入力するメソッド ProductMasterList.productList(); ``` こんなのがありましたが、この1行でやってることはなんですか? **「何を」「どうする」**にあてはめると、**「商品マスタ一覧を」「取得する」**ではありませんか? 入力じゃないですよね? ささいなことかもしれませんが、コメントに書いていることと実際の処理内容が食い違っていれば勘違いや混乱のもとになります。