2011-01-22 20 views
3

ファイル 'array.txt'に2次元のint配列があります。私は2次元の配列でファイル内のすべての要素を読み取ろうとしています。コピーに問題があります。代わりに元の値をコピーした後に値 '0'を持つすべての要素を表示します。私を助けてください。 私のコードは次のとおりです。ファイルから2次元配列を読み取る

import java.util.*; 
import java.lang.*; 
import java.io.*; 

public class appMainNineSix { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
     throws java.io.FileNotFoundException{ 
     // TODO Auto-generated method stub 
     Scanner input = new Scanner (new File("src/array.txt")); 
     int m = 3; 
     int n = 5; 
     int[][] a = new int [m][n]; 
     while (input.next()!=null){ 
      for (int i=0;i<m;i++){ 
       for (int j=0;j<n;j++) 
        a[i][j]= input.nextInt(); 
      } 

     } 
     //print the input matrix 
     System.out.println("The input sorted matrix is : "); 
     for(int i=0;i<m;i++){ 
      for(int j=0;j<n;j++) 
       System.out.println(a[i][j]); 
     } 

    } 

} 
+1

あなたはファイル自体を投稿することができますか? – Pointy

+0

私は、配列の値を出力するurコードを試しましたが、ファイルの最後に到達すると例外がスローされます! – palAlaa

答えて

8

while (input.next()!=null)

これは、スキャナ入力ストリームから何かを消費します。代わりに、試してみてくださいwhile (input.hasNextInt())

あなたのコードをどれだけ頑強にするかによって、forループの中で何かが読めるようになっているかチェックしてください。

Scanner input = new Scanner (new File("src/array.txt")); 
// pre-read in the number of rows/columns 
int rows = 0; 
int columns = 0; 
while(input.hasNextLine()) 
{ 
    ++rows; 
    Scanner colReader = new Scanner(input.nextLine()); 
    while(colReader.hasNextInt()) 
    { 
     ++columns; 
    } 
} 
int[][] a = new int[rows][columns]; 

input.close(); 

// read in the data 
input = new Scanner(new File("src/array.txt")); 
for(int i = 0; i < rows; ++i) 
{ 
    for(int j = 0; j < columns; ++j) 
    { 
     if(input.hasNextInt()) 
     { 
      a[i][j] = input.nextInt(); 
     } 
    } 
} 

(何の先読みは必要ありません)のArrayListを使用する代替:

まあ
// read in the data 
ArrayList&ltArrayList&ltInteger>> a = new ArrayList&ltArrayList&ltInteger>>(); 
Scanner input = new Scanner(new File("src/array.txt")); 
while(input.hasNextLine()) 
{ 
    Scanner colReader = new Scanner(input.nextLine()); 
    ArrayList col = new ArrayList(); 
    while(colReader.hasNextInt()) 
    { 
     col.add(colReader.nextInt()); 
    } 
    a.add(col); 
} 
+0

'input.nextInt()'が 'm x n'回呼ばれたとしても、それは十分ではありません。 –

+0

true、よりスマートなファイルを読むための補遺を追加 – helloworld922

+2

あなたはファイルを開いて読んでいます** 2回**? –

0

問題は、あなたが数字を読むためのネストされたループのペアが内を立ち往生持っていることであってもよいことwhileループ。なぜあなたはを一度読んだ後にアレイの値を再読み込みしたいのですか?そして最後の数字の後のファイルに何かがある場合は、ファイルの終わりに達した後に.nextInt()が返すもので配列を埋めるでしょう!それが問題ではないかもしれないので、

編集 —も.nextInt()は、入力がなくなったときに、私は推測する例外をスローする必要があります。

0

スタートシンプルな...

変更:

for (int j=0;j<n;j++) 
    a[i][j]= input.nextInt(); 

へ:

for (int j=0;j<n;j++) 
{ 
    int value; 

    value = input.nextInt(); 
    a[i][j] = value; 
    System.out.println("value[" + i + "][" + j + " = " + value); 
} 

と値が読み込まれていることを確認してください

また、あなたはいけません最初にhasNext(またはnextInt/hasNextInt)を呼び出す(そしてチェックする)ことなく、nextを呼び出します。

+0

'int value = input.nextInt();'宣言して一度に割り当てるのはなぜですか?すみません、私のペットはおしっこです。 – pstanton

+0

私は物事が一貫していることを望んでいるから、いつも宣言して割り当てることはできないので、私は決して宣言して割り当てません。 – TofuBeer

0

問題は、ファイルの終わりに到達するときに、usch要素が存在しないという例外があります。

public static void main(String[] args) { 
    // TODO Auto-generated method stub   
    try { 
     Scanner input = new Scanner(new File("array.txt")); 
     int m = 3; 
     int n = 5; 
     int[][] a = new int[m][n]; 
     while (input.hasNextLine()) { 
      for (int i = 0; i < m; i++) { 
       for (int j = 0; j < n; j++) { 
        try{// System.out.println("number is "); 
        a[i][j] = input.nextInt(); 
         System.out.println("number is "+ a[i][j]); 
        } 
        catch (java.util.NoSuchElementException e) { 
         // e.printStackTrace(); 
        } 
       } 
      }   //print the input matrix 
      System.out.println("The input sorted matrix is : "); 
      for (int i = 0; i < m; i++) { 
       for (int j = 0; j < n; j++) { 
        System.out.println(a[i][j]); 

       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

例外を処理せずにキャッチすることはわかっていましたが、一時的に機能します。 ファイルをソースフォルダの外に置くことに注意してください。あなたはグアバを使用して試すことができます

0

public class MatrixFile { 
    private final int[][] matrix; 

    public MatrixFile(String filepath) { 
     // since we don't know how many rows there is going to be, we will 
     // create a list to hold dynamic arrays instead 
     List<int[]> dynamicMatrix = Lists.newArrayList(); 

     try { 
      // use Guava to read file from resources folder 
      String content = Resources.toString(
       Resources.getResource(filepath), 
       Charsets.UTF_8 
      ); 

      Arrays.stream(content.split("\n")) 
       .forEach(line -> { 
        dynamicMatrix.add(
         Arrays.stream(line.split(" ")) 
          .mapToInt(Integer::parseInt) 
          .toArray() 
        ); 
       }); 
     } catch (IOException e) { 
      // in case of error, always log error! 
      System.err.println("MatrixFile has trouble reading file"); 
      e.printStackTrace(); 
     } 

     matrix = dynamicMatrix.stream().toArray(int[][]::new); 
    } 
関連する問題