java - 如何跳过某些部分读取文件并输入数据信息二维数组

标签 java arrays

我正在尝试流式传输文件并将其内容输入二维数组。我有这段代码可以成功读取文件的所有内容。我想调整我的代码,使其跳过文件的第一行(# R1 R2 R3 R4 R5)和文件每一行开始的数字。在某种程度上,我想删除 arr[X][Y] 中所有 X = 0 和 Y = 0 的元素。我想在使用扫描仪读取文件时执行此操作,而不是创建一个新数组并遍历第一个数组并将所需数据存储在新数组中。

这是流式文件:

#   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

编辑:通过使用扫描器读取循环之前的第一行删除不需要的行并重新调整第二个 for 循环,问题已得到解决。代码示例:

 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();
   }

}

最佳答案

对此最简单的解决方案(尽管相当明显)就是不阅读您不想阅读的元素。您的代码将像这样修改:

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> 。然后它将删除第一个不需要的行,然后是每行前面的第一个数字。

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);
}

看看 main 方法现在看起来更优雅了吗?这就是方法的使用方式。始终旨在使它们具有更动态的性质,而不是硬编码的样式。

关于java - 如何跳过某些部分读取文件并输入数据信息二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56197727/

相关文章:

java - 就性能而言,在 Java 中执行一个 for 多个操作或多个 for 每个操作一个操作有何影响?

java - Spring LibGDX And​​roid 应用程序中缺少 java.beans.Introspector

arrays - 配置单元检查单元

c# - 如何在现有数组的索引中创建数组,C#

php - PHP 数组的问题

c++ - 棘手的方法 - 需要解决方案

javascript - 仅找到第一个匹配项并返回数组中的剩余字符

java - 如何将 HashMap 的 Arraylist 发送到 _POST?然后如何在 PHP 中剖析数组?

具有可编程调度程序的 Java 休息框架?

Java 使用泛型进行模糊方法调用