回答編集履歴

1

コメントに対して回答の追加

2016/03/31 04:23

投稿

tkturbo
tkturbo

スコア5572

test CHANGED
@@ -95,3 +95,165 @@
95
95
 
96
96
 
97
97
  ↑こんなんしてもコンパイルエラーになりますよ?
98
+
99
+
100
+
101
+ ■以下追加:
102
+
103
+
104
+
105
+ ```
106
+
107
+ for(Entry<String, Profit> entry : totalHolder.entrySet()) {
108
+
109
+ //System.out.println(entry.getKey() + " ," + entry.getValue().count + " ," + entry.getValue().salesAmount);
110
+
111
+ arr = totalHolder.values().toArray(new Profit[i]);
112
+
113
+ //System.out.println(arr[i]);
114
+
115
+ i += 1;
116
+
117
+ }
118
+
119
+ ```
120
+
121
+ まずここ。
122
+
123
+ **無意味なループ**です。
124
+
125
+ ここでやりたいことは
126
+
127
+
128
+
129
+ **・「Profit[] arr = null;」で宣言したProfitインスタンスの配列にHashMap<String, Profit>の中身を詰め込む。**
130
+
131
+
132
+
133
+ ことですね。
134
+
135
+
136
+
137
+ ```
138
+
139
+ arr = totalHolder.values().toArray(new Profit[]);
140
+
141
+
142
+
143
+ ```
144
+
145
+ この1行で完了します。
146
+
147
+
148
+
149
+ また、
150
+
151
+ ```
152
+
153
+ /**
154
+
155
+ * 売上金額を大きい順に並べ替えるメソッド
156
+
157
+ */
158
+
159
+ sortAmount(arr);
160
+
161
+ ```
162
+
163
+ ここではメソッドにProfit配列を渡して処理してもらってますね?
164
+
165
+
166
+
167
+ これと同じように、出力するメソッドも
168
+
169
+ ```
170
+
171
+ /**
172
+
173
+ * 売上金額の上位3位を出力するメソッド
174
+
175
+ */
176
+
177
+ public static void outputBest3(Profit[] arr){
178
+
179
+
180
+
181
+ ```
182
+
183
+ のように定義してやって、このメソッドにソートが終わった配列を渡してあげれば完了ではありませんか?
184
+
185
+ ```
186
+
187
+ // outputBest3の実行
188
+
189
+ outputBest3(arr);
190
+
191
+
192
+
193
+ ```
194
+
195
+
196
+
197
+ まとめ:
198
+
199
+ こんな書き方になるはずです。
200
+
201
+ ```
202
+
203
+ if(sold > 0){
204
+
205
+ // 1.新しい月の売上が出てきたので、今までの分を出力
206
+
207
+
208
+
209
+ // 2.処理対象の月のヘッダを出力する
210
+
211
+ bwA.write(date.substring(0, 6) + "月売上高BEST3");
212
+
213
+ bwA.newLine();
214
+
215
+ // 3.Profitインスタンスの配列にHashMap<String, Profit>の中身を詰め込む
216
+
217
+ arr = totalHolder.values().toArray(new Profit[]);
218
+
219
+ // 4.上で取得したProfit配列を売上金額が大きい順に並べ替える
220
+
221
+ sortAmount(arr);
222
+
223
+ // 5.売上金額の上位3位を出力する
224
+
225
+ outputBest3(arr);
226
+
227
+
228
+
229
+ date = itemA[0]; //売上日を再セット
230
+
231
+ }
232
+
233
+
234
+
235
+ ```
236
+
237
+
238
+
239
+ **「何を」「どうする」**というのがしっかり切り分けられないとプログラムになりません。(この場合の主語は「プログラムが」)
240
+
241
+ このことが明確になってないとプログラムはおかしくなります。
242
+
243
+ たとえば質問のソースで
244
+
245
+ ```
246
+
247
+ // 商品マスタ一覧を入力するメソッド
248
+
249
+ ProductMasterList.productList();
250
+
251
+ ```
252
+
253
+ こんなのがありましたが、この1行でやってることはなんですか?
254
+
255
+ **「何を」「どうする」**にあてはめると、**「商品マスタ一覧を」「取得する」**ではありませんか?
256
+
257
+ 入力じゃないですよね?
258
+
259
+ ささいなことかもしれませんが、コメントに書いていることと実際の処理内容が食い違っていれば勘違いや混乱のもとになります。