JAVA初心者です。
下記のような商品別売上げデータ表を作成していますが商品マスタと売上明細の結合が上手くいきません。
【仕様内容】
商品マスタのデータと売上明細の商品コードを比較し一致したら、
出力ファイルに売上明細と商品マスタにある必要なデータを抽出し出力する。
売上明細をもとに商品マスタより商品名と単価を取得します。
売上明細を出力した後、売上金額の大きい商品の順に出力します(sort機能は使用しない)。
【問題点】
①商品マスタと売上明細の結合方法が分からない。
②//売上データのamtを集計結果に加算するというところで、
下記のエラーが表示される。
Exception in thread "main" java.lang.ClassCastException:
java.lang.String cannot be cast to java.lang.Integer
③売上金額を昇順に並べ替える方法が分からない。
④売上金額順に出力したいがどのデータを抽出してよいのか分からない。
どのようにすれば完成例を実現することができるのでしょうか。
どうぞよろしくお願いいたします。
【完成例】 商品名,数量,売上金額 シャーペン,5,500 セロテープ,4,800 ノート,7,840 消しゴム,6,600 付箋,3,450 シャーペン,2,200 定規,4,560 付箋,2,300 商品マスタ未存在,, 商品名,合計数量,合計売上高 ノート,7,840 セロテープ,4,800 付箋,5,750 シャーペン,7,700 消しゴム,6,600 定規,4,560
package lessons; 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.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class DataProcessing { public static void main(String[] args) { BufferedReader brP = null; BufferedReader brS = null; BufferedWriter bwO = null; List<Map<String, Object>> products = new ArrayList<Map<String, Object>>(); Map<String, Object> product = null; List<Map<String, Object>> sales = new ArrayList<Map<String, Object>>(); Map<String, Object> sale = null; String stP = ""; //inPファイルデータを格納 String stS = ""; //inSファイルデータを格納 String[] itemP = null ; //inPファイルデータを配列に格納 String[] itemS = null ; //inSファイルデータを配列に格納 Map<Object, Map<String, Object>> hashTable = new HashMap<Object, Map<String, Object>>(); Map<Object, Map<String, Object>> resultsMap = new HashMap<Object, Map<String, Object>>(); Map<String, Object> result = null; final String noItem = "商品マスタ未存在"; try{ try{ brP = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inP.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inM.csvファイルが見つかりません。"); } try{ brS = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inS.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inA.csvファイルが見つかりません。"); } try{ bwO = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outO.csv"),"SJIS")); }catch(FileNotFoundException e){ System.err.println("outA.csvファイルが見つかりません。"); } while((stP = brP.readLine()) != null){ if(stP.equals("")){ System.err.println("データに不備があります。"); } itemP = stP.split(","); product = new HashMap<String, Object>(); product.put("code",itemP[0]); //商品コード product.put("name",itemP[1]); //商品名 product.put("price",itemP[2]); //単価 products.add(product); } for ( int i = 0; i < products.size(); ++i ) { product = products.get( i ); // 商品データのcodeを取得する。 Object key = product.get( "code" ); // codeをキーとして、商品データをハッシュテーブルに格納する。 hashTable.put( key, product ); //System.out.println(hashTable); } bwO.write("商品名" + "," + "数量" + " ," + "売上金額"); bwO.newLine(); try{ while((stS = brS.readLine()) != null){ if(stS.equals("")){ System.err.println("データに不備があります。"); } itemS = stS.split(","); sale = new HashMap<String, Object>(); sale.put("sales_date",itemS[0]); //売上日 sale.put("code",itemS[1]); //商品コード sale.put("amt",itemS[2]); //数量 sales.add(sale); // 売上データのproduct_codeを取得する。 Object product_code = sale.get( "code" ); if(hashTable.containsKey(product_code)){ //売上データと商品データを結合する。 sale.put( "product_name", product.get( "name" ) ); sale.put( "price", product.get( "price" ) ); // 売上データのcodeを取得する。 Object code = sale.get( "code" ); if ( ! resultsMap.containsKey( code ) ) { // マップにキーcodeが含まれていない // 集計結果の初期値を生成する。 result = new HashMap<String, Object>(); result.put( "code", code ); result.put( "amt", 0 ); result.put( "total", 0 ); // 生成した初期値をキーcodeに関連付けてマップに格納する。 resultsMap.put( code, result ); } // キーcodeに関連付く集計結果をマップから取得する。 result = resultsMap.get( code ); // 売上データのamtを集計結果に加算する。 int s_amt = Integer.valueOf((String) sale.get( "amt" )); int r_amt = Integer.valueOf((String) result.get( "amt" )); result.put( "amt", r_amt + s_amt ); // 売上データのpriceとamtとを掛けた値を集計結果に加算する。 int s_price = Integer.valueOf((String) sale.get( "price" )); int r_total = Integer.valueOf((String) result.get( "total" )); result.put( "total", r_total + s_price * s_amt ); String n =(String) product.get( "name" ); String a = (String) sale.get( "amt" ); int sum = s_price * s_amt; bwO.write( n + "," + a + "," + sum); bwO.newLine(); }else{ Object no = noItem; //商品名=商品マスタ未存在 bwO.write( no + "," + "," + ","); bwO.newLine(); } }//while for(int i=0; i<resultsMap.size(); i++){ //売上金額を昇順に並べ替え for(int j=i+1; j < resultsMap.size(); j++){ if(resultsMap(i) < resultsMap(j)){ int temp=resultsMap(i); resultsMap(i)=resultsMap(j); resultsMap(j)=temp; } } } bwO.write("商品名" + "," + "合計数量" + "," + "合計売上高"); bwO.newLine(); for(int i=0; i < resultsMap.size(); i++){ //売上金額順に出力 String n =(String) product.get( "name" ); bwO.write(n + "," + s_price + "," + r_total ); bwO.newLine(); } }catch(IOException e){ e.printStackTrace(); } }catch(IOException e){ System.err.println("何らかのエラーが発生しました。"); }finally{ try { brP.close(); brS.close(); bwO.close(); } catch (IOException e) { e.printStackTrace(); } } }//main }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/28 14:12
2016/03/28 14:31
2016/03/28 16:10
2016/03/28 16:27
2016/03/31 01:20
2016/03/31 01:35
2016/04/01 10:05