ファイルの内容を配列に格納する方法とは?

このQ&Aのポイント
  • ファイルの内容を配列に格納したい場合、以下の手順で行うことができます。
  • まず、ファイルを読み込みます。
  • 次に、kのインデックスでソートし、配列に格納します。
回答を見る
  • ベストアンサー

ファイルの内容を配列に格納したい

困っているので、皆様の力を貸してください。 以下のようなファイルを読み込み、kのインデックスでソートしてから 配列に格納したいのですがどのようにしたらできますでしょうか? -------------------ファイル内容------------------------------ (= k0 9999) (= k1 1111) (= k2 2222) (= k4 4444) (= k3 3333) ------------------------------------------------------------- 上のファイルの場合は int[0] = 9999; int[1] = 1111; int[2] = 2222; int[3] = 3333; int[4] = 4444; といったように配列に格納したいです。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • komi1341
  • ベストアンサー率65% (25/38)
回答No.2

やり方はいろいろあると思いますが、例えばインデックス(k)と値を格納するための自作クラスを作ってはいかがでしょう。で、1行読み込むたびにそのクラスのオブジェクトを作って、インデックスと値を覚えさせる。 ファイルの行数はあらかじめ分からないのでしょうか? だとすると値の保持の仕方も工夫が必要になってきます。ArrayListのような可変長リストクラスの使い方はご存知ですか? ご存知であれば、リストを1つ作っておいて上記のオブジェクトをそこに追加していくのが楽だと思います。 で、ソートの仕方については自前で実装するか、上記の自作クラスにComparableを実装させて、という方法があります。速度を気にしないなら、実装も発想も簡単なバブルソートを自前で実装するとか。 http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/bubble-sort.html Comparableを使うなら下記のようなサイトが参考になるでしょう。 http://www5b.biglobe.ne.jp/~psoft/lesson/sort.html ソースを拝見した限りでは、まだあまりプログラミングに慣れていないようにお見受けします。だとすると、今回お話した a. 各行データの格納方法の検討(配列にするかクラスにするか等) b. 可変長リストの利用 c. ソート を一度に実現するのは大変だと思います。 時間があるのであれば、1つずつ別個に勉強して、最後に1つに合わせて完成、とした方が理解しやすいかもしれません。例えばArrayListの使い方をまず勉強し、int配列をソートするプログラムを作り…という感じですね。一度に手をつけると、エラーが出たときどこがおかしいのか把握しにくくなってしまうので。 あと、ファイルは開いたら閉じる、という癖をつけることをお勧めします。つまりreaderのclose()が必ず呼ばれるようにする、ということですね。

donald_a_d
質問者

お礼

たびたび回答ありがとうございます。 データは結果を保持するためのクラスを作成してArrayListに保存する という方法を使わせていただくことにしました。 また、教えていただいたComparableを実装することでソートも実現できました。 これからはファイルも閉じるように気をつけます。 いろいろアドバイスしていただきありがとうございました。

その他の回答 (1)

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.1

どのあたりが分からないのでしょう。例えばファイル読み込みの方法さえ分からない、というのだと答え方も変わってくるので、もっと具体的に分からないことを書くか、作りかけのソースコードを載せるかした方がいい回答がつきやすいと思いますよ。 以下、文字列処理の部分だけが分からないと仮定します。 1.読み込んだ文字列をString.split()を使って分割。 2.分割結果の2つ目の文字列(k**のはず)の2文字目以降をString.substringで取得。 3.Integer.parseInt()で2.の文字列を数値化。 4.全行の処理が終わったら、3.で得た数値を元にデータをソート。

donald_a_d
質問者

お礼

回答ありがとうございます。 質問慣れしておらず、質問に不備があり申し訳ありません。 また、そういった点を指摘していただきありがとうございました。 回答をもとにやって見たところ1,2については分かったのですが、 3.で得たデータはどのように保持しておけばよいかが分かりません。 また、3.で得たデータをどのように利用してソートをすればよいかが 分からない状態です。 申し訳ありませんが3,4の処理についてもう少し詳しく教えていただけませんか。 タブ、スペースがうまく表示できないので非常にみにくいですが、 現状のソースコードは以下のようになっています。 import java.io.*; public class FileRead { public static void main(String arg[]){ try{ FileReader f = new FileReader("sample_result.txt"); BufferedReader b = new BufferedReader(f); String s; while((s = b.readLine())!=null){ /*1.文字列の分割*/ String[] sarray = s.split(" "); /*2.kのインデックスを取得*/ for(int i = 0; i < sarray.length;i++){ if(i % 3 == 1){ System.out.println(sarray[i].substring(1)); } } } }catch(Exception e){ System.out.println("ファイル読み込み失敗"); } } }

関連するQ&A

  • ファイルの読み込み、配列に格納

    お世話になります。Java初心者です Javaプログラムを実行する同じディレクトリにあるテキストファイルとデータファイルをコマンドラインで同時に読み込み それぞれ違う配列に格納したいのですが、1つのファイルの読み込みは出来ても2つ同時の読み込みと配列格納でつまづいています。 読み込むテキストファイルには以下のような1行の文が、 Dr. Fujita is great! 読み込むデータファイルには以下のような文字が書かれています。 AC 4C 7C 10C KC 3D 6D 9D QD JB 3C 6C 9C QC 2D 5D 8D JD JA 2C 5C 8C JC AD 4D 7D 10D KD 配列に格納する際、テキストファイルの場合は全て大文字にし、アルファベット以外の記号(スペース含)は全て消して配列に格納します。 上の例でいえばこのような状態で格納です↓ DRFUJITAISGREAT データファイルの場合は、2組1文字をそのまま配列に格納です。ただしスペースは飛ばします。 上の例でいえば、ACを配列0に、4Cを配列1に、7Cを配列2に、、、と格納していきます。 import java.io.*; public class sample{ public static void main(String[] args){ try{ FileReader f = new FileReader(args[0]); BufferedReader b = new BufferedReader(f); Strings; while((s=b.readLine())!=null){ System.out.println(s); ←読み込んでるか確認 } }catch(Exception e){ System.out.println(no file); } } } ファイルの指定は実行時に、java sample datafile.dat textfile.txt と指定します。 読み込むプログラムは以上のように書いたのですが、2つファイルを読み込むにはどのように記述したらよいのでしょうか。 FileReaderを2つ作成?しても最初に指定したデータファイルの内容がまた読み込まれるだけで・・・ 読み込んだら変数sに入りますが、たとえばs.substring()なんかでわけて配列に入れようとしても、s.substring()←ここでエラーが出てしまいます。 あと、Dr. Fujita is great!のアルファベットを大文字にし、記号(スペース含)を飛ばして格納するにはどうしたらよいのでしょうか。 宜しくお願いします

    • ベストアンサー
    • Java
  • c言語 配列 や ソート datファイル読み込みについて

    初投稿でC言語初心者なのでよろしくお願いします。 課題でdatファイルから100万個の数字を読み込んで、ソートのタイムを競うのがでました。 ソートのアルゴリズム等は分かるのですが、100万個の数字を読み込むのがわかりません。 datファイルには、縦にずらっと数字が並べられていてどこを区切り文字としてとりだすのとか。 int配列も100万個も格納できないので3次元配列つかうのかなと思ってみたりしてます。 どうやって格納すればソートで使いやすいかご教授お願いいたします。

  • ファイル内の文字を配列に格納

    ファイル内の文字列をも表示させた上で、文字列を配列に1つずつ格納したいのですが、とっても簡単な方法で教えてください。 ファイル名は「abc」で配列名は「moji」でお願いします。

  • データベースに配列を格納する

    私はデータベースを本で勉強していたのですが物にするため、実際にデータベースのプログラムをくんでみようと設計を考えたのですが、疑問があります。 私はデータベースに、プログラム上で取り扱っているサイズがことなる複数の配列内のデータを格納したいのですが、これはデータベースにどのように格納すればよいのか分からず困っています。 図で説明すると 例えば {1} {12 33 24 21} {13 56 0 1} という3つの配列を同じデータベースに入れようとした場合 ID int1 int2 int3 int4 1 1 null null null 2 12 33 24 21 3 13 56 0 1 という形で入れる事になると思いますが、ここにサイズが5の配列をいれようとした場合は列が増えることになってしまいます。すると色々めんどくさいことになるのではないかと思います。 このようなデータベースに入れるデータのサイズが分からない場合は、どのようにするべきなのでしょうか?(なおJDBCを使い、SQLiteに入れています) やや抽象的かつ、意味がわかりにくい質問ですが不足な点は説明させていただきますので、ご回答よろしくお願いします。

    • ベストアンサー
    • MySQL
  • CSVファイルを多次元配列に格納する

    CSVファイルをopenCSVを読み込んでその行と列の要素数の多次元配列を作りその配列にデータを格納したいです。 しかし、データが格納できません。2回目の格納するためにwhileから何かおかしいのではないかと思っています。 なにかわかる方、アドバイスが欲しいです。 public class ReadCSV { public static void main(String[] args){ try{ CSVReader reader = new CSVReader( new FileReader("/home/masa/Desktop/WameiSample.csv")); //配列の宣言 String[] nextLine; //データを配列に入れる要素数を見る int j = 0; nextLine = reader.readNext(); int k = nextLine.length; System.out.println("列数[i]"+k); System.out.println("nextLine"+nextLine); while((nextLine = reader.readNext()) != null){ for (int i=0; i<nextLine.length; i++){ //System.out.print(nextLine[i] + "|" + i + "|"); } //System.out.println(); j++; } System.out.println("行数[j]"+j); //記憶する配列 String[][] Wamei = new String[k][j]; System.out.println("きてるよ"); //データを配列に格納していく int x = 0; while((nextLine = reader.readNext()) != null){ System.out.println("きてるよ");  <---こっから、表示してくれない. for (int y=0; y<nextLine.length; y++){ Wamei[x][y] = nextLine[y]; //多次元配列の要素を表示する System.out.print(Wamei[x][y]+"Wamei"+x+y); } System.out.println(); x++; } } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • 2次元配列への格納方法について

    こんにちは。 FILE *fp; SIZE 1024; int n; char Buf[1025]; while((n = fread(Buf,1,SIZE,fp)) != 0){ } というように、fread関数を用いて1024バイトずつ配列Bufへ格納しています。 以下に示すようなことを行う場合、どのように記述すればよいのでしょうか? B:バイナリデータ T:数値 TBBBBBBBBB・・・・・・B←1024バイト目 TBBBBBBBBB・・・・・・B ・ ・ ・ ・ TBBBBBBBBB・・・・・・B というように、配列内に格納したいと思っています。 Tは、テキストデータで1,2,3・・・・100という整数型を格納。Bは、バイナリデータでfread関数から取得したバイナリデータを格納します。 なぜ、Tを格納したいかといいますと、どのバイナリデータを指しているか?を判別するためです。 上記のようなことを行うためには、2次元配列を使用すればよいのでしょうか? 例:char Buffer[100][1025]

  • ファイルからの読み込み 配列

    座標データの数値のテキストファイルから配列の中に座標値を格納したいのですが、int型のデータを読み込んで配列に格納するのは、どのようにプログラムを組めばよろしいのでしょうか?下のようにxzahyou.csvというファイルから配列Z[i]に格納したくて組んでみたら、 br = new BufferedReader(new FileReader("xzahyou.csv")); for(int i=0;i<X.length;i++){ String line = br.readLine(); X[i]=line; X[i] = line;のところで互換性がないと出てきました。int型の場合どのようにすればよろしいのでしょうか?教えてください。お願いします。

  • C# スタックに格納する要素が配列について

    スタックに格納する要素が配列の場合 // スタック生成 Stack<int[]> StackObj = new Stack<int[]>(); // 格納する配列データーの作成 int[] ArrayWork = new int[2]; ArrayWork[0] = 7; ArrayWork[1] = 12; // スタックに格納 StackObj.Push(ArrayWork); のように記述できます 同様に、POP、PEEP、COUNTの場合、どのように記述すればいいでしょうか?

  • ファイルから一行を読み込み配列に格納したい

    すみません、初心者です。Javaでテキストファイルから一行の文字列を読み込み、Stringの配列に格納したいと思っています。具体的には、マシンの/tmp/test.txtを読み込み、空白行は無視して格納したいです。ウェブを参考にして、以下のようには出来たのですが、最初にStringの配列を20個宣言しており、これをどうにかテキストファイルの行(マイナス空白行)の数だけ宣言させたいです。(理由はファイルによっては想定以上の個数の場合も有り得ますし、余分なメモリを使用することになるのと、後からこの配列を使用しやすい、といった諸々で。。)以下のコードをどのように変えると実現出来るかご教示頂けませんでしょうか。 (一行あたりの文字列はつながっており、空白が間に入る事はありません) import java.io.*; public class test { public static void main(String[] args) throws Exception { int i=0; String[] str = new String[20]; FileReader fr = new FileReader("/tmp/test.txt"); StreamTokenizer st=new StreamTokenizer(fr); while(st.nextToken()!=StreamTokenizer.TT_EOF) { System.out.println(st.sval+" "); str[i]=st.sval; i++; } fr.close(); } } (test.txtが以下の場合) ----------------------- fdjosa djsoafdjfdajof jsoafds fdsaoofdafd fdjso fjds ----------------------- (配列は以下になることを想定) str[0]=fdjosa str[1]=djsoafdjfdajof str[2]jsoafds str[3]=fdsaoofdafd str[4]=fdjso str[5]=fjds (*配列数であるstr.lengthは6)

    • ベストアンサー
    • Java
  • テキストファイルの内容を2次元配列に格納したい

    課題で用意されたテキストファイルを読み込み、空白を区切りとする文字列の単位で配列に格納したいのですが、やりかたがわかりません。 ソースプログラムですが #include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 1000 int TextSplit(char *fname, char (*SpStr)[50]); int main(void) { int i, n; char fname[MAX], SpStr[MAX][50]; int Split; FILE *fp; printf("input File =>"); scanf("%s", fname); Split = TextSplit(fname, SpStr); printf("\n %d[文字列数] \n", Split); return 0; } int TextSplit(char *fname, char (*SpStr)[50]) { int i, j, k; char Readstr[MAX]; FILE *fp; fp = fopen(fname, "r"); if(fp == NULL) { printf("ファイルオープン失敗"); return 1; } i = 0; while(fscanf(fp, "%s", SpStr) != EOF) { i++; } fclose(fp); return i; } 以上のソースプログラムですが、内容は「空白で区切る文字列の単位の総数を表示する」ものになっています。 今日の20時までに終わらせないといけないので、ご教授お願いします。 使ってるソフトはMicrosoft Visual Studioです。

専門家に質問してみよう