- ベストアンサー
実用的なjavaプログラムを作りたい
実用的なプログラムを作りたいのですが、 入力をcsvファイルで 名前1,172.3,65.8(名前,身長,体重) 名前2,164.5,47.9 名前3,180.3,94.7 ・ ・ ・ といったファイルを呼び出したときに 出力をcsvファイルで 平均身長:172.4,平均体重:69.5 名前1,172.3,65.8,22.2,標準(名前,身長,体重,BMI,判定) 名前2,164.5,47.9,17.7,痩せ 名前3,180.3,94.7,29.1,肥満 ・ ・ ・ といった具合にcsvファイルを作ることができるjavaを作ろうと思ったのですが、数十時間格闘してまったく進展がありません。 どうかアドバイスをください。 BMI判定は20以下が痩せで25以上が肥満です ( )は表示しなくてよいです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
String[ ][ ]は、String型の配列ですから、今度は、数値をString型へ変換する必要があります。 J2SE 5.0以降、C言語でよく使われるprintf()に相当する機能が追加されました。 次のサンプルを参考にしてみてはどうでしょうか。 ------------------------------------------------------------------ import java.util.Formatter; public class Format { public static void main(String args[]) { int nn = 1234; String ss; Formatter fmt = new Formatter(); // Formatterオブジェクト fmt.format("nn=%d", nn); System.out.println(fmt.toString()); System.out.println(fmt); ss = String.format("nn=%d", nn); System.out.println(ss); System.out.printf("nn=%d\n\n", nn); // double の場合 double dd = 1234.567; Formatter fmt2 = new Formatter(); // Formatterオブジェクト fmt2.format("dd=%f", dd); ss = fmt2.toString(); System.out.println(ss); Formatter fmt3 = new Formatter(); // Formatterオブジェクト fmt3.format("dd=%7.2f", dd); ss = fmt3.toString(); System.out.println(ss); } } ------------------------------------------------------------------ 実行結果 ------------------------------------------------------------------ nn=1234 nn=1234 nn=1234 nn=1234 dd=1234.567000 dd=1234.57 ------------------------------------------------------------------ このssをString[ ][ ]に代入できると思います。 ------------------------------------------------------------------ たか
その他の回答 (4)
- manabu4673
- ベストアンサー率52% (9/17)
No.2です。No.2では助言にならない助言で失礼しました。 ずいぶん頑張っておられるようでもう一息というところですね。 まず確認しておきたいのは、hairetu[][]という配列が bmimaker#readCSV()のreturnで得られる配列のままかどうかですね。 仮にreturnで得られてモノの場合、もとのCSVが','(カンマ)2つで区切られた3要素しかないものなので、hairetu[][]の2つ目のindexは0~2にしかなりません。 この場合、範囲外の添え字を指定したとかってExceptionが出ていませんか? また、配列が別で用意した[numData][4]になっているものの場合、 入力の文字列を先にDouble.parseDouble(String s)で計算用の数値に変換して、BMIを算出し、 そのあと、数値を文字列に変換して配列に戻せば期待通りじゃないでしょうか? もう一息だと思います。がんばってください。
お礼
どうもありがとうございます。 先ほど完成しました。 皆さんのおかげでここまでこれたし、応援されてやる気が出ました。 とても感謝しています。
- auty
- ベストアンサー率58% (284/486)
「データを数値として扱えない」ということに関してですが、 Integer.parseInt(String s) Double.parseDouble(String s) 等で、数値に変換できます。 ------------------------------------ たか
お礼
ありがとうございます。 おかげさまでだいぶ進みました。 double bmi=taijuu/sintyou/sintyou*10000; とういう形式でBMIの計算式を作ったのですが String[][]hairetuのなかのhairetu[i][3]の箱の中へBMIの数値を入れるのに戸惑ってます。 Double.parseDouble(String s)をつかってもうまくいかないです。 bmi=Double.parseDouble(hairetu[i][3]); と直してもコンパイルは通っても実行でエラーになります。 これが終われば完成すると思うので、どうすればいいのかどなたか教えてください。
- manabu4673
- ベストアンサー率52% (9/17)
何がどう進まないのかわかりませんが 今の時点で回答できることとしたら、こんなトコですかね。 ファイルを開く。 一行ずつ取り込む。 カンマ区切りで分けて変数に移す。 必要な計算を適宜実施する。 結果をファイルに出力する。 この通り作っても実用レベルかどうかと言われるとアレですが。
お礼
ありがとうございます。 地道に作業したいと思います。
まずは、数十時間格闘した結果を補足しましょう。 いまのままでは、丸投げと同じで削除対象になってしまいます。 ここまで出来たけど、こうなってしまうorこうならない等を示しましょう。
補足
Bmimaker.java(主のプログラム)は ================================ class Bmimaker { static String[ ][ ] readCSV(String filename) throws java.io.FileNotFoundException, java.io.IOException { int numData = CountLine.count(filename); java.io.FileReader freader = new java.io.FileReader(filename); java.io.BufferedReader breader = new java.io.BufferedReader(freader); String[ ][ ] data = new String[numData][ ]; String currentLine; for(int i = 0; i < numData; i = i + 1){ currentLine = breader.readLine( ); data[ i ] = currentLine.split(","); } breader.close( ); freader.close( ); return data; } public static void main(String[ ] args) throws java.io.FileNotFoundException, java.io.IOException { String[ ][ ] newData = readCSV(args[0]); for(int i = 0; i < newData.length; i = i + 1){ for(int j = 0; j < newData[i].length; j = j + 1){ System.out.print(" "); System.out.print(newData[i][j]); } System.out.println( ); } CSVmaker.outputCSV(newData, "read.csv"); } } ================================ となっております。またCSVmakerのほうは ================================ class CSVmaker { static void outputCSV(String[ ][ ] data, String filename) throws java.io.FileNotFoundException { java.io.PrintStream writer = new java.io.PrintStream(filename); for(int i = 0; i < data.length;i= i+1){ for(int j = 0; j < data[i].length;j= j+1){ writer.print(data[i][j]); if(j < data[i].length-1){ writer.print(","); } } writer.println( ); } writer.close( ); } } ================================ となっております。 入力したファイルを出力する手順は行えるのですが、 このままではデータを数値として扱えないので計算もできません。 しかし、その方法がどうにもわかりません。 質問補足たりなくて申し訳ありませんでした。
お礼
サンプルまでつけていただき本当にありがとうございます。 とてもわかりやすかったので順調に作業でき、先ほど完成しました。 本当に感謝しています、ありがとうございました。