• 締切済み

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

宿題できなくてあせってます。 宿題の内容は、テキストファイル(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*/

みんなの回答

回答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