ファイルを読み込み、特定の部分をスキップして、データ情報2次元配列を入力する方法

Vasko Vasilevの:

私は、2D配列にファイルや入力、その内容をストリーミングしようとしています。私は成功したファイルのすべての内容を読み取り、このコードを持っています。私はそれがファイル(#R1 R2 R3 R4 R5)と、ファイルの各行から始まる番号の最初の行をスキップするような方法で自分のコードを調整したいです。ように、私はARRの[X] [Y]をX = 0、Y = 0を持つすべての要素を削除したいです。私はスキャナでファイルを読み込むのではなく、新しい配列をクレートと最初の1を通過し、新しいものに必要なデータを格納しながら、これを行うしたいと思います。

これは、ストリーミングファイルです。

#   R1  R2  R3  R4  R5
1   J   S2  Q   S2  J
2   J   S2  Q   S2  J
3   J   S2  Q   S2  J
4   J   S2  Q   S2  J
5   J   Q   S5  Q   J
6   S3  Q   S5  Q   S3
7   S3  Q   S5  Q   S3
8   S3  Q   S5  Q   S3
9   S3  S1  S5  S1  S3
10  A   S1  S5  S1  A
11  A   S1  K   S1  A
12  A   S1  K   S1  A
13  A   S1  K   S1  A
14  A   S1  K   S1  A
15  S2  A   K   A   S2
16  S2  A   S3  A   S2
17  S2  A   S3  A   S2
18  S2  A   S3  A   S2
19  S2  A   S3  A   S2
20  Q   S5  S3  S5  Q
21  Q   S5  J   S5  Q
22  Q   S5  J   S5  Q
23  Q   S5  J   S5  Q
24  Q   S5  J   S5  Q
25  S4  K   S2  K   S4
26  S4  K   S2  K   S4
27  S4  K   S2  K   S4
28  S4  K   S2  K   S4
29  S4  K   S2  K   S4
30  K   S4  S2  S4  K
31  K   S4  A   S4  K
32  K   S4  A   S4  K
33  K   S4  A   S4  K
34  K   S4  A   S4  K
35  S1  S4  A   S4  S1
36  S1  A   S1  A   S1
37  S1  A   S1  A   S1
38  S1  A   S1  A   S1
39  S1  A   S1  A   S1
40  Q   S3  S1  S3  Q
41  Q   S3  Q   S3  Q
42  Q   S3  Q   S3  Q
43  Q   S3  Q   S3  Q
44  Q   J   Q   J   Q
45  S2  J   S4  J   S2
46  S2  J   S4  J   S2
47  S2  J   S4  J   S2
48  S2  S2  S4  S2  S2
49  S2  S2  A   S2  S2
50  J   S2  A   S2  J
51  J   S2  A   S2  J
52  J   Q   A   Q   J
53  J   Q   A   Q   J
54  J   Q   J   Q   J
55  S5  Q   J   Q   S5
56  S5  J   J   J   S5
57  S5  J   J   J   S5
58  S5  J   S1  J   S5
59  S5  J   S1  J   S5
60  A   S3  S1  S3  A
61  A   S3  S1  S3  A
62  A   S3  Q   S3  A
63  A   S3  Q   S3  A
64  A   K   Q   K   A
65  S1  K   Q   K   S1
66  S1  K   S4  K   S1
67  S1  K   S4  K   S1
68  S1  Q   S4  Q   S1
69  S1  Q   S4  Q   S1
70  K   Q   K   Q   K
71  K   Q   K   Q   K
72  K   J   K   J   K
73  K   J   K   J   K
74  K   J   K   J   K
75  S3  J   J   J   S3
76  S3  NA  J   NA  S3
77  S3  NA  J   NA  S3
78  S3  NA  J   NA  S3

   public static void main(String[] args) throws FileNotFoundException 
{
   Scanner sc = new Scanner(new BufferedReader(new FileReader("reels_template.txt")));

   int arrX = 78;
   int arrY = 6;
   String [][] arr = new String[arrX][arrY];
   String[] line = {};



     for (int i=0; i<arrX; i++) {
         if (sc.hasNextLine()) {
         line = sc.nextLine().trim().split("\\s+");
         }
        for (int j=0; j<arrY; j++) {        
            arr[i][j] = line[j] + " ";                             
        }
     }


   for (int i = 0; i < arrX; i++) {
       for ( int j = 0; j < arrY; j++) {
           System.out.print(arr[i][j]);
       }
       System.out.println();
   }

}

これは、上記のコードの出力であります:

 # R1 R2 R3 R4 R5 
 1 J S2 Q S2 J 
 2 J S2 Q S2 J 
 3 J S2 Q S2 J 
 4 J S2 Q S2 J 
 5 J Q S5 Q J 
 6 S3 Q S5 Q S3 
 7 S3 Q S5 Q S3 
 8 S3 Q S5 Q S3

これは、所望の出力です:

 J S2 Q S2 J 
 J S2 Q S2 J 
 J S2 Q S2 J 
 J S2 Q S2 J 
 J Q S5 Q J 
 S3 Q S5 Q S3 
 S3 Q S5 Q S3 
 S3 Q S5 Q S3

EDIT:問題は、ループが不要な行を削除し、ループの第二を再調整する前に、最初の行を読み取るために、スキャナを使用することによって解決されています。コードサンプル:

 public static void main(String[] args) throws FileNotFoundException 
{
   Scanner sc = new Scanner(new BufferedReader(new FileReader("reels_template.txt")));

   final int arrX = 78;
   final int arrY = 5;
   String[][] arr = new String[arrX][arrY];
   String[] line = {};


     line = sc.nextLine().trim().split("\\s+");
     for (int i=0; i<arrX; i++) {
         if (sc.hasNextLine()) {
         line = sc.nextLine().trim().split("\\s+");
         }
        for (int j=0; j<=arrY; j++) {  
            if (j!=0) {
            arr[i][j-1] = line[j] + " "; 
           }
        }
     }


   for (int i = 0; i < arrX; i++) {
       for ( int j = 0; j < arrY; j++) {
           System.out.print(arr[i][j]);
       }
       System.out.println();
   }

}
Soutzikevich:

これに対する最も簡単な解決策(たとえかなり明白)は、単にあなたが読みたくないという要素を読んでいないことであろう。あなたのコードはそうのように修正されるだろう。

public static void main(String[] args) throws FileNotFoundException {
   Scanner sc = new Scanner(new BufferedReader(new FileReader("reels_template.txt")));

   int arrX = 77;
   int arrY = 4;
   String [][] arr = new String[arrX][arrY];
   String[] line = {};

   sc.nextLine();  // remove the first line from the scanner

   for (int i=0; i<arrX; i++) {
     if (sc.hasNextLine())
       line = sc.nextLine().trim().split("\\s+");

       for (int j=0; j<arrY; j++) {        
         arr[i][j] = line[j+1] + " "; //always skips first element of 'line'                           
       }
    }


    for (int i = 0; i < arrX; i++) {
      for ( int j = 0; j < arrY; j++) 
        System.out.print(arr[i][j]);

      System.out.println();
    }

}

しかし、コードのこの作品は、「行」の具体的な数と、各行の要素の特定の番号を持つファイルで動作します。どのようにそれはより多くの「動的」ことについて?

以下の方法では、などのファイルのすべての行を追加しますStringに、ArrayList<String>これは、第1の不要なラインその後、各ラインの前にある最初の番号を削除します。

public ArrayList<String> readFileText (String filename){
    //ArrayList to hold all the lines
    ArrayList<String> lines = null;

    //Get lines of text (Strings) as a stream
    try (Stream<String> stream = Files.lines(Paths.get(filename))){
        // convert stream to a List-type object
        lines = (ArrayList<String>)stream.collect(Collectors.toList());
    }
    catch (IOException ioe){
        System.out.println("\nCould not read lines of text from the file.\n" +
                "Reason: parameter \"" + ioe.getMessage() + "\"");
    }
    catch (SecurityException se){
        System.out.println("Could not read the file provided." + 
          "Please check if you have permission to access it.");
    }

    lines.remove(0);  //Remove the first line of the file. Line at index 0.

    for(String line : lines)
        //Fine the first occurrence of white-space in each line,
        //and use that substring, to remove the number of the line.
        line = line.substring(line.indexOf(" "));

    return lines;
}

あなたのコード内でこのメソッドを使用するには:

public static void main(String[] args){
    ArrayList<String> allFileLines = readFileText("reels_template.txt");

    for(String line : allFileLines)
        System.out.println(line);
}

主な方法は、今どのように見えるか、よりエレガント参照してください?これは、メソッドが使用されている方法です。常にそれらをより持たせることを目指し、動的ではなくハードコーディングスタイルよりも、自然を。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=206905&siteId=1