1

このようなテキストファイルがあるとします。

1 4 6
2 3    
5 8 9 4
2 1
1

私がやりたいのは、それらがどのように表現されているかを正確に2次元配列に格納することです。いくつかのグーグルと読書の後、私は次のコードを思いつきました。

Scanner s = new Scanner(new BufferedReader(new FileReader("myData.txt")));     

while (s.hasNextLine())
{
    String myStr = s.nextLine();
    x = 0;
    for ( int y = 0; y <= myStr.length(); y+=2)
    {
        myStr = myStr.trim();
        tempStr = myStr.substring(y, y+1)
        num[row][coln] = Integer.parseInt(tempStr);
        coln++
    }
    row++;
}

問題なく動作しますが、1 桁しかない整数の場合です。しかし、長さが異なる整数があるとどうなりますか。整数の長さを動的にチェックするにはどうすればよいですか?

たとえば、このテキスト ファイルを 2 次元配列に格納したい

13 4 652
2 343    
5 86 9 41
2 18
19

誰かが私を正しい方向に向けることができれば、それは非常に役に立ちます。ありがとう

4

7 に答える 7

3

文字列に使用できますsplit()。空白を区切り文字として使用すると、文字列の配列が返され、行内の各数値が配列内の 1 つのスロットにマップされます。次に、配列をループして を使用しますInteger.parseInt()

それを行う別の方法は、出力nextLine()を別のものにフィードし、数値を取得するためにScanner使用することです。nextInt()

于 2013-10-27T04:47:13.033 に答える
0

スキャナークラスの nextInt メソッドを使用すると、整数値が1つずつ得られます。

まず、havenextXXX メソッドを使用して、ファイルに次のような整数値があるかどうかを確認する必要があります

scanner.hasNextInt()

あなたが次のようなプログラムを書くことができるよりも

import java.util.*;

public class ScannerDemo {
   public static void main(String[] args) {

     Scanner scanner = new Scanner(new BufferedReader(new FileReader("myData.txt")));     


      while (scanner.hasNext()) {
         if (scanner.hasNextInt()) {
            System.out.println("integer present" + scanner.nextInt());
         }
         System.out.println("no integer" + scanner.next());
      }
      scanner.close();
   }

}

JavaDocs から、 nextInt() メソッドは、次の条件下でこれらの例外をスローします。

InputMismatchException - if the next token does not match the Integer regular expression, or is out of range
NoSuchElementException - if input is exhausted
IllegalStateException - if this scanner is closed
于 2013-10-27T04:46:34.220 に答える
0

次のコードを使用できます。

Scanner scan = new Scanner(new File("test.txt"));
scan.useDelimiter("\\Z");
String content = scan.next();
ArrayList output=new ArrayList();
ArrayList<Inteher> inner=new ArrayList<Integer>();
String[] a1=content.split("\n");
for(String a:a1){
String a2=a1.plit(" ");
for(String b:a2){
inner=new ArrayList<Integer>();
inner.add(Integer.parseInt(b));
}
output.add(inner);

}
于 2013-10-27T04:49:35.957 に答える
0

MappedByteBuffera を使用してこれをバイナリとして読み取り、数値をそのように処理する方がはるかに高速です。この同様のコンテキストでの私の実験では、3 倍高速でした。行ごとに読み取るには、次の 2 つの点で大きなオーバーヘッドがあります。

  1. String非常に多くのオブジェクトを作成および破棄しているため、ガベージ コレクターはおかしくなります。
  2. すべての文字を 2 回処理します。1 回は を構築するときStringに、次にそれを数値に変換するときにもう 1 回です。を分割してStringからそれぞれを変換すると、各文字を 3 回処理します。

それは、速度が必要か、簡潔でシンプルなコードが必要かによって異なります。このアプローチの方が理解しやすいことは間違いないStringので、ファイルが常に小さいことがわかっている方がよいでしょう。しかし、それが巨大になる可能性がある場合は、バイナリ アプローチを検討する必要があります。

于 2014-09-12T18:19:54.463 に答える
0

私はこのようにします

    String[] a = mystr.split(" +");
    num[i] = new int[a.length];
    for (int j = 0; j < a.length; j++) {
        num[i][j] = Integer.parseInt(a[j]);
    }

また、最初の部分を次のように変更します

    List<String> lines = Files.readAllLines(Paths.get("myData.txt"), StandardCharsets.UTF_8);
    int[][] num = new int[lines.size()][];
    for(int i = 0; i < lines.size(); i++) {
        ...
于 2013-10-27T04:51:37.833 に答える
0

これを試すことができます:

try {

        InputStream in = getClass().getResourceAsStream(s);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        int[][] values = new int[numRows][numCols];

        int numRows = br.readLine();
        int numCols = br.readLine();

        String delims = "\\s+";
        for (int row = 0; row < numRows; row++) {
            String line = br.readLine();
            String[] tokens = line.split(delims);
            for (int col = 0; col < numCols; col++) {
                values[row][col] = Integer.parseInt(tokens[col]);
            }
        }

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

テキスト ファイルの場合は、次のように設定します。

10 // amount of numbers across
7 // amount of numbers down
6 6 6 6 6 65 6 6 6 6
6 6 7 6 6 6 6 6 6 6
6 6 6 6 6 6 6 6 6 6
6 6 6 6 6 6 72 6 6 6
6 6 6 6 6 6 6 6 6 6
6 6 89 6 6 6 6 345 6 6
6 6 6 6 6 6 6 6 6 6

整数を 2D 配列に読み込むときに、幅と高さを認識できるように、横方向と下方向の数値を入れます。

これが役に立ったことを願っています!

于 2013-10-27T04:51:54.477 に答える