• ベストアンサー

外部ファイルから読み込んだデータを配列変換したい!

Japanese 72 99 40 Math 88 48 32 English 13 77 96 というデータファイル(test.dat)があります。数字は省略しましたが各200ずつ計600で、データ数はJapanese・Math・Englishの行含め全部で603です。上から順に出席番号1番2番・・・となりますので200人分の成績データということになります。 これら数値データを用いて各教科ごとの平均点を出したり、成績順に並べ替えたりしたいのです。 そのためにこのデータファイルの数値の部分だけ配列にしたいのですが、外部のファイル、しかも数値と文字が混じったデータを配列に変換するにはどうすればよいでしょうか。 [00],[01],[02]・・・・・・・・(以下200人分) [10],[11],[12]・・・・・・・・ [20],[21],[22]・・・・・・・・ というのをイメージしているのですが(列は出席番号・行は各教科)、他に良いアイデアはありますでしょうか。 申し訳ありませんが、ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.6

ANo#3さんの言われるようにexcelが簡単でしょうがjavaでやりたいなら、以下のコード参考にしてください。合計と平均はプログラムの中で計算しています。 なおtest.datの最終行に END という文字列を追加してください。 import java.io.*; public class LineCalc { public static void main(String args[]){ String[] item= {new String("Japanese"), new String("Math"), new String("English"), new String("END")}; int[][] intArray=new int[3][200]; try{ BufferedReader br=new BufferedReader(new FileReader("test.dat")); String line=null; for(int i=0;i<item.length-1;i++){ int sum=0; int point=0; int counter=0; if(i==0) line=br.readLine(); if(line.equals(item[i])){ while(!(line=br.readLine()).equals(item[i+1] )){ point=Integer.parseInt(line); intArray[i][counter]=point; sum=sum+point; counter++; } System.out.println(item[i]+":合計:"+sum); System.out.println(item[i]+":平均:"+sum/counter); } } for(int k=0;k<3;k++){ for(int j=0;j<200;j++){ System.out.print(intArray[k][j]+" "); } } br.close(); }catch(Exception ex){ ex.printStackTrace(); } // } }

lutea
質問者

お礼

ご回答ありがとうございます! ソースを参考にして、無事希望するものを作成することができました!! 本当に助かりました。こころよりお礼申し上げます。

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.7

No.3の補足です。 java.util.ArrayListは、可変長配列を扱えるクラスです。 普通の配列のように、宣言時に要素数を決めるのではなく 処理しながら要素を追加していくような使い方をします。 使い方の詳細はAPIドキュメントを参照いただくとして 簡単に書くと、こんな使い方ができます。 addで追加、getで取得、iteratorで反復子を取り出します。 ----------------- import java.util.ArrayList; import java.util.Iterator; public class Test {   public static void main(String args[]) {     // コマンドライン引数をArrayListに移し替え     ArrayList list = new ArrayList();     for(int i = 0 ; i < args.length ; i++) {       list.add(args[i]);     }     // ArrayListの要素数を表示     System.out.println("要素数=" + list.size());     // ArrayListの内容を順次表示(get)     System.out.println("getで内容表示");     for(int i = 0 ; i < list.size() ; i++) {       System.out.println((String)list.get(i));     }     // ArrayListの内容を順次表示(Iterator)     System.out.println("Iteratorで内容表示");     Iterator it = list.iterator();     while(it.hasNext() == true) {       System.out.println((String)it.next());     }   } } ----------------- $ java Test あいう abc 123 要素数=3 getで内容表示 あいう abc 123 Iteratorで内容表示 あいう abc 123 ----------------- データも今の形式より、もし変えられるようであれば 以下のような形式の方が扱いやすいでしょう(CSVです)。 ----------------- No,Japanese,Math,English 1,72,88,13 2,99,48,77 3,40,32,96 : : -----------------

lutea
質問者

お礼

ArrayListをわかりやすくご教授くださりどうもありがとうございました! たいへん勉強になりました。参考にして頑張ってみます!

すると、全ての回答が全文表示されます。
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.5

>文字列を数値に変換したいのですが、方法がわかりません。 JavaDocでjava.lang.Integerクラスを調べましょう。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html
lutea
質問者

お礼

ご回答ありがとうございます。 いろいろと勉強不足ですみません…

すると、全ての回答が全文表示されます。
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.4

どのあたりでつまずいているのでしょう? a外部ファイルにアクセスする方法は出来ている? b外部ファイルから1行ずつ読むのはできている? c読んだ1行のデータを、文字列型変数に代入することはできている? d読んだデータは文字列型なのでそれを数値型(intやdouble)に変換する関数は知っている? e2次元配列の宣言の仕方、書式は知っている?   配列の添え字が0から始まることは知っている? fデータの並び方や個数は常に同じか?   No2の方の発言にある通りだとして以下のように配列を用意してみます。  →教科項目用に文字列型配列 配列の個数3  →数値データに2次元配列  3×200 g読み込み行カウント変数を用意して、0行目から開始 h. whileで1行ずつ読み込む、終了条件はファイルエンド i 行数を201で割った余りが0なら項目用文字列型配列に代入、配列番号は201で割った商 j 行数を201で割った余りが0ではないときは、数値型配列に代入    [項目番号:201で割った商][出席番号-1:201で割った余り-1] k 行カウント変数をインクリメントして次の行 No3の方のように、ArrayListをつくる方がよりオブジェクト指向な作りだとは思います。

lutea
質問者

お礼

ご回答ありがとうございます。 なんとか外部ファイルを読み込んで、IFで条件分けをして教科項目を除いて、成績データを多次元配列にするところまでいきました。 このような感じです。 国語   数学   英語 [1][1]  [2][1]  [3][1]  :    :    : [1][200] [2][200] [3][200] しかし、各教科の平均を出したりするため、文字列を数値に変換したいのですが、方法がわかりません。 出来たところまでのソースをはります。 import java.io.*; public class java05 { public static void main(String args[]) throws IOException{ String ss; int i=0, j=0, k=0, m=0, n=0, x=0; int data[] =new int[200]; String a[][] =new String[4][201]; BufferedReader fin = new BufferedReader( new FileReader("score.dat")); for(i=1; i<=3; i++){ for(j=0; j<=200; j++){ ss=fin.readLine(); if(j!=0){ a[i][j]=ss; System.out.println("("+i+","+j+")="+a[i][j]); } } } fin.close(); } } データ構造はNo2の方のおっしゃるとおりです。 一応、score.dat(test.dat)を置いておきます。 http://jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst?.dir=/%a5%de%a5%a4%a5%c9%a5%ad%a5%e5%a5%e1%a5%f3%a5%c8&.view=l&.src=bc&.done=http%3a//jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst%3f.dir=/%25a5%25de%25a5%25a4%25a5%25c9%25a5%25ad%25a5%25e5%25a5%25e1%25a5%25f3%25a5%25c8%26.src=bc%26.view=l 重ねてアドバイスいただけたら幸いです。

すると、全ての回答が全文表示されます。
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.3

Excelとかに貼り付けた方が簡単な気がしますが… 私なら…   int japanese   int math   int english をプロパティに持つクラスを作って、 それをArrayListに持つクラスを作って、 親のクラスにソートや集計のメソッドを持ちます。

lutea
質問者

お礼

ご回答、ありがとうございます! しかしせっかくお教えくださったのですが、ArrayListがわかりません…。 なにぶん応用が利かないもので、もしよろしければ質問のArrayList使用例をご記述くださると助かります…。なるべくオブジェクト指向が好ましいので…。

すると、全ての回答が全文表示されます。
  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.2

外部リソースとなる、外部ファイルのデーター構造がいまいちわかりにくいのですが、、、 --------------------------------------------- Japanese 72 99 40 (以下200人分つづく) Math 88 48 32 (以下200人分つづく) English 13 77 96 (以下200人分つづく) --------------------------------------------- といった形でしょうか?

lutea
質問者

お礼

わかりづらくて申し訳ないです。 データ構造はそのとおりです。 念のためこちらにscore.datを置いておきます。(質問にはtest.datとありますが、中身は同じです) http://jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst?.dir=/%a5%de%a5%a4%a5%c9%a5%ad%a5%e5%a5%e1%a5%f3%a5%c8&.view=l&.src=bc&.done=http%3a//jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/lst%3f.dir=/%25a5%25de%25a5%25a4%25a5%25c9%25a5%25ad%25a5%25e5%25a5%25e1%25a5%25f3%25a5%25c8%26.src=bc%26.view=l もしよろしければアドバイスをいただけると嬉しいです。 よろしくお願いします。

すると、全ての回答が全文表示されます。
  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.1

俺だったら int japanesepoint[]; int mathpoint[]; int englishpoint[]; ってのに値をぶち込む。

すると、全ての回答が全文表示されます。

関連するQ&A