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

我正在尝试流式传输文件并将其内容输入2D数组.我有这段代码可以成功读取文件的所有内容.我想以这样的方式调整代码,使其跳过文件的第一行(#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();
    }

}

但是,这段代码仅适用于具有特定数量的“行”和每行中具有特定数量的元素的文件.如何使其更具“动态性”?

以下方法会将文件的每一行作为字符串添加到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);
}

看看主要方法现在看起来有多优雅?这就是方法的使用方式.始终要使它们具有更动感的特性,而不是硬编码的样式.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&amp;FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = &quot;hello&quot;; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let&#39;s briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越