プロが教える店舗&オフィスのセキュリティ対策術

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]・・・・・・・・
というのをイメージしているのですが(列は出席番号・行は各教科)、他に良いアイデアはありますでしょうか。

申し訳ありませんが、ご教授願います。

A 回答 (7件)

俺だったら


int japanesepoint[];
int mathpoint[];
int englishpoint[];
ってのに値をぶち込む。
    • good
    • 0

外部リソースとなる、外部ファイルのデーター構造がいまいちわかりにくいのですが、、、



---------------------------------------------
Japanese
72
99
40
(以下200人分つづく)
Math
88
48
32
(以下200人分つづく)
English
13
77
96
(以下200人分つづく)

---------------------------------------------

といった形でしょうか?
    • good
    • 0
この回答へのお礼

わかりづらくて申し訳ないです。
データ構造はそのとおりです。
念のためこちらにscore.datを置いておきます。(質問にはtest.datとありますが、中身は同じです)

http://jp.y42.briefcase.yahoo.co.jp/bc/hsawqipg/ …

もしよろしければアドバイスをいただけると嬉しいです。
よろしくお願いします。

お礼日時:2005/01/31 19:46

Excelとかに貼り付けた方が簡単な気がしますが…



私なら…
  int japanese
  int math
  int english
をプロパティに持つクラスを作って、
それをArrayListに持つクラスを作って、
親のクラスにソートや集計のメソッドを持ちます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/31 20:55

どのあたりでつまずいているのでしょう?



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をつくる方がよりオブジェクト指向な作りだとは思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なんとか外部ファイルを読み込んで、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/ …
重ねてアドバイスいただけたら幸いです。

お礼日時:2005/01/31 20:39

>文字列を数値に変換したいのですが、方法がわかりません。


JavaDocでjava.lang.Integerクラスを調べましょう。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/inde …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/05 21:45

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;
intcounter=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();
}
//
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/05 21:48

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


-----------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/02/05 21:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!