映画のエンドロール観る派?観ない派?

今、
a 001 1
a 002 1
b 002 2
b 003 2
c 001 2
c 002 4
c 004 3
d 003 2
d 005 1
e 006 4

このように並んでいる表を
001 002 003 004 005 006
a 1 1 0 0 0 0
b 0 2 2 0 0 0
c 2 4 0 3 0 0
d 0 0 2 0 1 0
e 0 0 0 0 0 4

というような表に書き換えたいのですが、
何かいい方法はないでしょうか?
データ数が膨大なので、EXCELなどでやるわけにもいかず困っています。
javaでプログラムを組もうと思っているのですが、
具体的にどのようにすればいいものでしょうか?

A 回答 (4件)

a 001 1


というデータの、"a"の部分をY座標に。"001"の部分をX座標に変換できる関数を作れば、配列として扱えるようになるので、後は楽だと思います。

データの仕様が書かれていないので、適当に想像して書いてみました。
表の大きさ(X,Yの最大値)が決まっていれば、サンプルのように配列でいいですが、これが未定の場合は、Mapなどを使うと良いと思います。
static String[] lines = {
 "a 001 1",
 "a 002 1",
 ~中略~
 "e 006 4",
};
public static void main(String[] args){
 int [][] values = new int[10][10]; //ここでは、10x10の表とする
 
 //読み込んだデータを1つずつ処理する
 for (int i = 0; i < lines.length; i++){
  String[] elements = lines[i].split(" "); //スペースで分割
  int x = getX(elements[1]);
  int y = getY(elements[0]);
  values[y][x] = Integer.parseInt(elements[2]); //数値化
 }
 
 //valuesの中身を確認
 for (int y = 0; y < values.length; y++){
  for (int x = 0; x < values[y].length; x++){
   System.out.print(values[y][x] + ",");
  }
  System.out.println();
 }
}

private static int getY(String s){
 return (int)(s.charAt(0) - 'a'); //a->0, b->1, c->2に変換
 
}
private static int getX(String s){
 String temp = s.replaceAll("^[0]+", ""); //先頭の0を除去
 return Integer.parseInt(temp) - 1; //数値化して-1する
}
    • good
    • 0
この回答へのお礼

丁寧な解説つきでとても分かりやすかったです。
ぜひぜひ参考にさせていただきたいと思います。
本当にありがとうございました。

お礼日時:2005/12/19 21:02

試しに作ってみました。


適宜状況に合わせて変更して下さい。
----------------------------------------------------------------
import java.io.*;
import java.util.*;

class Convert {
public static void main(String args[]){
Scanner sc = null;
TreeSet<String> tsn = new TreeSet<String>();
TreeSet<String> tsi = new TreeSet<String>();
TreeMap<String,Integer> tm = new TreeMap<String,Integer>();
String inName="";
String inIndex="";
int inNum=0;

try{
sc = new Scanner(new File("data.txt"));
while(sc.hasNext()){
inName = sc.next();
tsn.add(inName);
inIndex = sc.next();
tsi.add(inIndex);
inNum = sc.nextInt();
tm.put(inName+":"+inIndex, inNum);
}
sc.close();
}
catch(FileNotFoundException e){
System.out.println("ファイルが無い:" + e);
}
catch(InputMismatchException e){
System.out.println("データ不良:" + e);
}
for(String index : tsi){
System.out.print(" " + index);
}
System.out.println();
for(String s : tsn){
System.out.print(s);
for(String i : tsi){
System.out.print(" " + ((tm.get(s+":"+i)==null)? 0 : tm.get(s+":"+i)));
}
System.out.println();
}
}
}
    • good
    • 0
この回答へのお礼

No.2に加え、プログラムを組んでいただき本当にありがとうございました。
勉強不足でまだわからないところもあるのですが、
ぜひぜひ参考にさせていただきます。
本当にありがとうございました。

お礼日時:2005/12/19 21:00

Mapを使ってできるんじゃないかな。


もし、データ数が大きすぎて処理できないのであれば、
最初にa,b,c…のような処理リストを作って、
aだけを処理して出力
bだけを処理して追加出力みたいな感じでいいんでないでしょうか
    • good
    • 0

このような場合データ数が膨大では


解決に向かわないと思います。
1.a 001 1 形式で何件ですか?
2.そのデータはいまありますか?
3.そのデータはどんな状態ですか?(紙、txt,csv etc)

この回答への補足

会社で保存しているので今は手元にはないのですが、
データ数は、約7万件で、csv形式で保存しています。
やはり難しいのでしょうか。。。

補足日時:2005/12/18 23:16
    • good
    • 0

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