JAVA初心者です。
月別の売上金額の大きい3商品を出力するプログラムを
作成しています。
以前こちらで問題点を解決いただき、完成には近づいているのですが
再び自身では解決できないことがあり投稿させていただきました。
【完成例】 商品名,数量 ,売上金額 ,備考 201601月売上高BEST3 バナナ,10,100, 玉ねぎ,8,80, トマト,6,60, 201602月売上高BEST3 バナナ,15,150, 玉ねぎ,14,140, 白菜,10,110, 商品マスタ未存在,,, ,,,日付に誤りがあります
【仕様内容】
売上明細をもとに商品マスタより商品名と単価を取得します。
売上金額の大きい商品の順に並び替えをして上位3つを出力します
(sort機能は使用しない)。
商品を出力する前に「yyyymm月売上高BEST3」を出力します。
【解決したいこと】
売上データが蓄積されたHashMapから合計金額を抽出し新たな配列に格納して大きい順に
並び替えをしたいのですが、sortAmountメソッドのところで「演算子 < は引数の型
lesson.Profit, lesson.Profit で未定義です」とEclipseに指摘されてしまいます。
この場合はどうすればよろしいのでしょうか?
どうぞよろしくお願いいたします。
package lesson; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map.Entry; public class MonthlySalesBest3 { public static BufferedWriter bwA = null ; //月額売上表出力ファイル public static void main(String[] args) { BufferedReader brA = null ; //売上明細入力ファイル String stA = ""; //inAファイルデータを格納 String[] itemA = null ; //inAファイルデータを配列に格納 HashMap<String, Profit> totalHolder = null ; //商品別一式の売上データを格納 String date = ""; //売上明細ファイルの購入月をセット boolean isFirst = false; //0番目の購入日をセットする為の変数 final String noItem = "商品マスタ未存在"; final String noDate = "日付に誤りがあります"; boolean emptyflgA = false; //売上明細入力ファイル空判定フラグ try{ fileError:{ try{ brA = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inA.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inA.csvファイルが見つかりません。"); } try{ bwA = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outA.csv"),"SJIS")); }catch(FileNotFoundException e){ System.err.println("outA.csvファイルが見つかりません。"); } /** * 商品マスタ一覧を入力するメソッド */ ProductMasterList.productList(); bwA.write("商品名" + "," + "数量" + " ," + "売上金額" + " ," + "備考"); //ヘッダー行を出力 bwA.newLine(); try{ while((stA = brA.readLine()) != null){ if(stA.equals("")){ System.err.println("データに不備があります。"); break fileError; } emptyflgA = true; itemA = stA.split(","); ProductMasterList.mpDM = ProductMasterList.alDM.get(itemA[1]); if(isFirst == false){ //date変数に売上月がセットされているか確認 date = itemA[0].substring(0, 6); isFirst = true; } String soldDate = (itemA[0].substring(0, 6)); int sold= soldDate.compareTo(date); //月変更の比較 if(sold > 0){ bwA.write(date.substring(0, 6) + "月売上高BEST3"); //月売上高BEST3を出力 bwA.newLine(); Profit[] arr = null; int i = 0; for(Entry<String, Profit> 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; } /** * 売上金額を大きい順に並べ替えるメソッド */ sortAmount(arr); date = itemA[0]; //売上日を再セット } if(ProductMasterList.alDM.containsKey(itemA[1])){ if(checkDate(itemA[0])){ //日付の妥当性を確認 if(totalHolder == null){ totalHolder = new HashMap<String, Profit>(); } String itemName = (String) ProductMasterList.mpDM.get("name"); if(!totalHolder.containsKey(itemName)) { //totalHolderに名前が登録されてなければ新しく登録。 totalHolder.put(itemName, new Profit()); totalHolder.get(itemName).itemName = itemName; // あとで値出力の時に使う } // 売上数量と売上金額を加算。 totalHolder.get(itemName).count += Integer.parseInt(itemA[2]); totalHolder.get(itemName).salesAmount += Integer.parseInt(itemA[2]) * Integer.parseInt(ProductMasterList.itemM[2]); } else{ String e = ""; //備考 e = noDate; //備考=日付に誤りがあります } }else{ Object b = noItem; //商品名=商品マスタ未存在 } }//while if(emptyflgA == false){ System.err.println("inA.csvファイルが空です。"); break fileError; } }catch(IOException e){ e.printStackTrace(); } }//fileError }catch(IOException e){ System.err.println("何らかのエラーが発生しました。"); } finally{ try { brA.close(); ProductMasterList.brM.close(); bwA.close(); } catch (IOException e) { e.printStackTrace(); } } }//main /** * 日付の妥当性をチェック * カレンダーに存在するかどうかを返す。 * 存在する日付の場合true */ public static boolean checkDate(String strDate) { if (strDate == null || strDate.length() != 8) { throw new IllegalArgumentException( "引数の文字列["+ strDate +"]" + "は不正です。"); } DateFormat format = new SimpleDateFormat("yyyyMMdd"); format.setLenient(false); try { format.parse(strDate); return true; } catch (Exception e) { return false; } } /** * 売上金額を大きい順に並べ替えるメソッド */ public static Profit[] sortAmount(Profit[] arr){ for(int i=0; i<arr.length-1; i++){ //売上金額を昇順に並べ替え for(int j=i+1; j < arr.length; j++){ if(arr[i] < arr[j]){ Profit temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } return arr; } /** * 売上金額の上位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(); } } }
package lesson; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.HashMap; public class ProductMasterList { public static BufferedReader brM = null ; //商品マスタ入力ファイル public static String stM = ""; //inMファイルデータを格納 public static String[] itemM = null ; //inMファイルデータを配列に格納 public static HashMap<String, Object> mpDM = null; //商品マスタデータを格納 public static HashMap<String,HashMap<String,Object>> alDM = new HashMap<String,HashMap<String,Object>>() ; //商品マスタの入力データを格納 public static boolean emptyflgM = false; //商品マスタファイル空判定フラグ public static HashMap<String, HashMap<String, Object>> productList( ){ try{ try { brM = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inM.csv"),"JISAutoDetect")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }catch(FileNotFoundException e){ System.err.println("inM.csvファイルが見つかりません。"); } //inMファイルデータを読み込み try { while((stM = brM.readLine()) != null){ if(stM.equals("")){ System.err.println("データに不備があります。"); } emptyflgM = true; itemM = stM.split(","); mpDM = new HashMap<String,Object>(); mpDM.put("code", itemM[0]); //商品コード mpDM.put("name", itemM[1]); //商品名 mpDM.put("price", itemM[2]); //単価 alDM.put(itemM[0],mpDM); //商品コードをキー、mpDMを値にして格納 } } catch (IOException e) { e.printStackTrace(); }//while if(emptyflgM == false){ System.err.println("inMファイルが空です。"); //break fileError; } return alDM; } }
package lesson; class Profit { /** 商品名 */ public String itemName = null; /** 売上数量 */ public int count = 0; /** 売上金額 */ public int salesAmount = 0; }
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/31 03:28
2016/04/01 09:45
2016/04/01 10:20