【问题标题】:My loop is populating my array with the number seven, 6 times, why?我的循环正在用数字七、六次填充我的数组,为什么?
【发布时间】:2018-11-29 03:49:09
【问题描述】:

我正在编写一个程序来读取文件并将字符串存储在 arraylist 中,并将 ints 存储在数组中。该文件包含以下格式的字符串和整数:String int

我已经让字符串部分开始工作,我想知道为什么下面的代码用数字 7 填充我的数组,而不是正确的数字。

正确的输出是:

12, 14, 16, 31, 42, 7

但它给出了:

7, 7, 7, 7, 7, 7

代码:

BufferedReader buffy = new BufferedReader(new FileReader(fileName));
     while((str = buffy.readLine()) != null) {
        for(int i = 0; i <= arrayInt.length - 1; i++) {
           for(int k = 0; k <= str.length()-1; k++) {
              if(str.substring(k, k + 1).equals(" ")) {
                 String nums = str.substring(k+1);
                 arrayInt[i] = Integer.parseInt(nums);
              }
           }
        }
     }
     buffy.close();

【问题讨论】:

  • 提示:您只需要 1 个循环即可填充一维数组。
  • 不是错误,但用于迭代数组的普通 java 习惯用法是 for(int i = 0; i &lt; arr.length; i ++)

标签: java arrays loops output


【解决方案1】:

这是因为文件中的每一行都填充了整个数组。

试试这个:

 int i = 0;
 BufferedReader buffy = new BufferedReader(new FileReader(fileName));
 while((str = buffy.readLine()) != null) {
    if(i < arrayInt.length) {
       for(int k = 0; k <= str.length()-1; k++) {
          if(str.substring(k, k + 1).equals(" ")) {
             String nums = str.substring(k+1);
             arrayInt[i] = Integer.parseInt(nums);
             break;
          }
       }
       i++;
    }
 }
 buffy.close();

你也可以使用indexOf

 int i = 0;
 BufferedReader buffy = new BufferedReader(new FileReader(fileName));
 while((str = buffy.readLine()) != null) {
    if(i < arrayInt.length) {
       int k = str.indexOf(" ");
       if(k!=-1) {
          String nums = str.substring(k+1);
          arrayInt[i] = Integer.parseInt(nums);
       }
       i++;
    }
 }
 buffy.close();

【讨论】:

  • 您可以使用 try-with-resources 自动关闭流。
【解决方案2】:

文件读取通常是批处理/ETL 类型的工作,如果此代码要投入生产并且会被多次使用而不是只使用一次,那么我想强调性能和易于维护

只读取最少的字符来识别空间索引

  • @talex 在循环中添加了一行非常好的代码,即break;,这样您就不需要阅读到行尾,但这只有在字符串没有空格时才有效。如果字符串可以包含空格,则需要lastIndexOf 空格(" ") 或根本不需要break;
  • 假设您使用的是 java,我更喜欢使用框架方法 lastIndexOf,因为:

    1. 它将从右侧而不是左侧开始读取,并假设数字的长度始终小于字符串,在大多数情况下,它会比从头开始读取更快地找到空间索引。
    2. 第二个好处是已经处理了很多场景框架/实用程序方法,所以为什么要重新发明轮子

      int k = str.lastIndexOf(" ");

    3. 最后但并非最不重要的一点是,如果其他人要维护此代码,这对他/她来说会更容易,因为会有足够的可用文档。

只从文件中读取需要的行

似乎你只需要一定数量的行来阅读arrayInt.length,如果是这种情况,那么你应该'break;'一旦计数器i 超过数组长度,while 就会循环。

I/O 操作成本高昂,尽管您会得到正确的输出,但即使不需要,您最终也会扫描整个文件。

别忘了 try-catch-finally

​​>

代码假定不会有任何问题,并且它可以在完成后关闭文件,但可能有 n 种组合可能导致错误,从而导致应用程序崩溃和锁定文件。

请看下面的例子:

    private Integer[] readNumbers(String fileName) throws Exception {
        Integer[] arrayInt = new Integer[7];
        String str = null;
        BufferedReader buffy = new BufferedReader(new FileReader(fileName));
        try {
            int i=0;
            while ((str = buffy.readLine()) != null) {
                if(i> arrayInt.length){
                    break;
                }
                //get last index of " "
                int k = str.lastIndexOf(" ");
                if(k > -1){
                    String nums = str.substring(k+1);
                    arrayInt[i] = Integer.parseInt(nums);
                }
                //increment the line counter
                i++;
            }
        } catch (Exception ex) {
            //handle exception
        } finally {
            buffy.close();
        }
        return arrayInt;
    }

【讨论】:

  • 你应该使用 try-with-resources 而不是 try-catch-finally。
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2021-03-03
  • 2016-08-28
  • 1970-01-01
相关资源
最近更新 更多