• 締切済み

テキストファイルから読み取り配列にあてはめソート

宿題できなくてあせってます。 宿題の内容は、テキストファイル(textstrs.txt)の内容を読み取ってARRAYに入れて 以下がテキストファイルの中身 3 Jones, Chris C Ferguson, Tom J Pryor, Richard P 一番初めのナンバーをARRAYのスロット数となり、そのスロットに 以下の3人の名前をあてはめ、アルファベット順に並び替えしたものを コンソールとテキストファイル(strsdataout.txt)に書くというものです。 今の段階は、まず読んでそのままコンソールに出すところですが それさえうまくいきません。とほほ 誰かわかる方おしえていただけますか。 import java.util.Scanner; import java.io.*; public class StringProject5 { //#1 public static void main(String[] args) throws Exception { //#2 // Create a File instance java.io.File inputFile = new java.io.File("D:\\teststrs.txt"); java.io.File outputFile = new java.io.File("D:\\strdataout.txt"); // Create Scanner for the file Scanner input = new Scanner(inputFile); FileReader in = new FileReader(inputFile); java.io.PrintWriter out = new java.io.PrintWriter(outputFile); BufferedReader br = new BufferedReader(in); int size = input.nextInt(); String[] strarray = new String[size]; int x = 0; while (input.hasNext()){ // while String ln = input.nextLine(); strarray [x] = ln; x++; } // end of while for (int i = 0; i < strarray.length; i++){ // for loop System.out.println(strarray[i]); //writing array in console }// end off for loop } //#2 } //#1*/

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

みんなの回答

回答No.2

import java.util.Scanner; import java.io.*; public class TestClass { //#1 public static void main(String[] args) throws Exception { //#2 // Create a File instance java.io.File inputFile = new java.io.File("D:\\teststrs.txt"); java.io.File outputFile = new java.io.File("D:\\strdataout.txt"); /***************************************************/ // Create Scanner for the file // ↓改行文字を区切り文字として Scanner 構築 Scanner input = new Scanner(inputFile).useDelimiter(System.getProperty("line.separator")); /***************************************************/ FileReader in = new FileReader(inputFile); java.io.PrintWriter out = new java.io.PrintWriter(outputFile); BufferedReader br = new BufferedReader(in); int size = input.nextInt(); String[] strarray = new String[size]; int x = 0; while (input.hasNext()){ // while /***************************************************/ //String ln = input.nextLine(); // ↓「次の行」ではなく「次のトークン」を読み込む String ln = input.next(); /***************************************************/ strarray [x] = ln; x++; } // end of while /***************************************************/ // ↓自然順序付けでソート java.util.Arrays.sort(strarray); /***************************************************/ for (int i = 0; i < strarray.length; i++){ // for loop System.out.println(strarray[i]); //writing array in console }// end off for loop } //#2 } //#1*/  Scanner よく調べたら useDelimiter っていうメソッドがあったので別のコードも。こっちの方が正しいのかな?要は (1) 改行を区切り文字として Scanner に処理させ nextInt() と next() で読み込む (2) nextLine() で統一してプログラマが改行を意識して読み込む のどちらをとるかという感じでしょうか。 Scanner 使うのだから (1) の方がいいかもですね。

valen_cali
質問者

お礼

早速のたいへん親切な回答ありがとうございます。 でもうまくいきません。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at StringProject5.main(StringProject5.java:38) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds) なエラーがでてしまいます。 宿題プロジェクトの全体をポストしますので、お時間がありましたらまた回答よろしくおねがいいたします。 ありがとうございました。

回答No.1

import java.util.Scanner; import java.io.*; public class TestClass { //#1 public static void main(String[] args) throws Exception { //#2 // Create a File instance java.io.File inputFile = new java.io.File("D:\\teststrs.txt"); java.io.File outputFile = new java.io.File("D:\\strdataout.txt"); // Create Scanner for the file Scanner input = new Scanner(inputFile); FileReader in = new FileReader(inputFile); java.io.PrintWriter out = new java.io.PrintWriter(outputFile); BufferedReader br = new BufferedReader(in); /********************************************************/ //int size = input.nextInt(); // ↓改行させる。 int size = Integer.valueOf(input.nextLine()); /********************************************************/ String[] strarray = new String[size]; int x = 0; while (input.hasNext()){ // while String ln = input.nextLine(); strarray [x] = ln; x++; } // end of while /********************************************************/ // ↓自然順序付けでソート java.util.Arrays.sort(strarray); /********************************************************/ for (int i = 0; i < strarray.length; i++){ // for loop System.out.println(strarray[i]); //writing array in console }// end off for loop } //#2 } //#1*/  Scanner使ったことないので詳しい仕様は分かりませんが、 nextInt() じゃカーソルが次の行の先頭までいかずに最初の行の改行文字の手前で止まってるのではないかと。それで読み込みの while に入った最初の nextLine() で空の文字列が返ってきていて配列をオーバーしていました。どうしても要素数を nextInt() で読み込みたいのならば、 Scanner の別のメソッドを駆使してカーソルを次の行の先頭へもっていく操作が必要になるんじゃないかと思います。認識が間違ってたらすみません。ソートは Arrays.sort(Object[]) で、とりあえず文字列の自然順序付けです。ファーストネームで並び替える場合は Comparator を自作してください。

関連するQ&A

  • JAVAのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 拡張子の読み込み制限を設けたいのですが・・・

    現在Javaのプログラム課題を行っているものです。 前回こちらで質問させていただいたのですが、 解決に至らなかったので再度質問させていただきたいと思います。 前回の質問→ http://okwave.jp/qa4023470.html こちらが修正後のプログラムの一部です。↓ package studyA; import java.util.*; import java.io.FileReader; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.IOException; public class A23_StrArray extends A22_StrArray { /** * テキストファイルの読込み(上書きモード) * @param path ファイルのパス * @exception FileNotFoundException ファイルが見つからなかった場合 * IOException 入出力エラーが発生した場合 */ // 修正として付け加えた部分(開始位置) public class CheckClass check { check = new CheckClass(); check = path; public boolean accept(path) { //拡張子がtxtであるかのの判定を行います。 String ext = getExtension(path); if (ext != null && ext.equals("txt")) { return true; } } } //プログラム修正箇所 (終点) public void readFile(String path) throws Exception { try { //BufferedReader in = new BufferdReader(new FileReader()) FileReader fr = new FileReader(path); //FileReaderのインスタンスを作成 BufferedReader br = new BufferedReader(fr); //BufferedReaderのインスタンスを作成 String line; list.clear(); //リストをクリア while ((line = br.readLine()) != null) //要素がなくなるまで繰り返す { add(line); } System.out.println("ファイルを読み込みしました。"); br.close(); } catch(FileNotFoundException e)//ファイルが見つからなかった時 { System.out.println("ファイルが見つかりません。"); } catch(IOException e)//入出力エラーが発生した場合 { System.out.println("入出力エラーが発生しました。"); } } 現在は、コンパイルエラーでC:\Java>javac A23_StrArray.java A23_StrArray.java:28: '{' がありません。 public class CheckClass check と表示されます。一体どのように修正を加えれば、 txtのみ読み込んで、上書きなどができるプログラムを作ることができるのでしょうか?

    • ベストアンサー
    • Java
  • 固定長データのbyteスキップについて

    バイナリ入出力でご質問がございます。 下記の例のように各レコードにある 先頭5byte付与されたデータを スキップ(破棄)して 各レコード10byteずつ読み込みたいのですが なにかサンプルデータもしくは アドバイス頂けないでしょうか? どうぞよろしくお願い致します。 例 1レコード 10byte (先頭5byte付与) LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 ↓ 1234567890 1234567890 1234567890 1234567890 1234567890 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • レコード長からのbyteスキップ設定について

    QNo.8229324から あらたに新規でご質問させて頂きます。 1レコードごとに10byteあったとします。 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 レコード長からスキップ設定を35byteと設定したとします。 40byteごとに頭の付与された5byteをスキップさせたいのですが なにかサンプル及びアドバイス頂けますでしょうか? 仕様案 (1)まずはレコード先端の5byteをスキップ (2)次は35byteを超えた時点で5byteスキップを繰り返し。 どうぞ宜しくお願い致します。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • jspでファイルの読み込み

    jspでwebサーバーにある“1.txt”ファイルを読み込んでそれを表示するプログラムを作成したのですが、エラーが出てしまいます。サーバーの環境(jsp実行環境等)は問題ありません。以下のコードで何かおかしなところがありましたら教えてください。 <%@ page contentType="text/html" import="java.util.*,java.io.*" %> <% String result = ""; String h_s = ""; FileReader h_fr = new FileReader("1.txt"); BufferedReader h_br = new BufferedReader(h_fr); while(true){ h_s = h_br.readLine(); if (h_s == null){ break; } result = result + h_s; } %> <%= result %>

    • ベストアンサー
    • Java
  • テキストファイルから日本語部分を抽出

    英語と日本語が交ざっているテキストから日本語部分を抽出するプログラムをPerlで書きたいと思って以下のようなプログラムを組みました。 --- #!/usr/bin/perl print "Input file name: "; $ifname = <STDIN>; #print "Output file name: "; #$ofname = <STDIN>; $ofname = ">> tmp.txt"; open(INPUTFILE, $ifname); open(OUTPUTFILE, $ofname); while($c = getc(INPUTFILE)){ if('a'<= $c && $c <= 'z' || 'A'<= $c && $c <= 'Z'){ }else{ print OUTPUTFILE $c; } } close(INPUTFILE); close(OUTPUTFILE); --- これを実行したところ、日本語も英語も書き出されず、数字だけ書き出されてしまいました。 日本語部分だけを抽出するようにするにはどのようにすれば良いでしょうか。 ご教示願います。

    • ベストアンサー
    • Perl
  • テキストファイルが読み込めない

    みなさんはじめまして、下記ソースなんですが「FileInputStream fi = new FileInputStream(inputFile);」の手前までは処理が流れるの ですが、その後の処理が流れなくて困っています。 ターゲットとなる「test.txt」ファイルはHTML・JAVAソースファイル クラスファイルと同じフォルダに存在します。 特に保存先等を指定していないので、必然的に同じフォルダ内を見てフ ァイルを読み込みに行くんですけど、読み込まず、そのまま処理が流れ てしまいます。 どこかやり方がいけないところがあるんでしょうか? public String FileInput(){ byte data[] = new byte[16]; String number = ""; try { File inputFile = new File("test.txt"); FileInputStream fi = new FileInputStream(inputFile); /* データを読み込み */ if(fi.read(data)== 16){       /* 0バイト目から9バイト目までを読み込み */ if(new String(data,0,9).equals("010105502")){         /* 0バイト目から16バイト目までをnumberに代入 */ number = new String(data,0,16); } } fi.close(); } catch(FileNotFoundException e){ e.printStackTrace(); } catch(IOException e){} return(number); }

    • ベストアンサー
    • Java
  • ストリーム テキスト

    初心者の質問です。よろしくお願いします。 Javaのストリームを勉強しているのですが、FileReaderでテキストファイル(txt)を入力するにはどうすれば良いのでしょうか? Javaファイルは正しく入力できたのですが。 FileReader fr=new FileReader(args[0]);では、問題があるのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java