首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的循环是用数字7、6填充数组,为什么?

我的循环是用数字7、6填充数组,为什么?
EN

Stack Overflow用户
提问于 2018-11-29 03:49:09
回答 2查看 53关注 0票数 1

我正在编写一个程序,用于读取文件,并将字符串存储在数组中,将字符串存储在数组中。该文件包含格式为: String int的字符串和int。

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

正确的产出是:

代码语言:javascript
复制
12, 14, 16, 31, 42, 7

但它提供了:

代码语言:javascript
复制
7, 7, 7, 7, 7, 7

代码:

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-29 04:02:40

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

试试这个:

代码语言:javascript
复制
 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

代码语言:javascript
复制
 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();
票数 1
EN

Stack Overflow用户

发布于 2018-11-29 07:17:59

文件读取通常是批处理/ETL类型的工作,如果这段代码将被多次使用,而不是只使用一次,那么我想强调一下性能和易于维护的

只读取最少的字符以标识空间索引

  • @talex添加了非常好的代码行,即循环中的break;,这样直到行尾才需要读取,但只有在字符串没有空格的情况下才能工作。如果字符串可以包含超出您需要的空间,则需要lastIndexOf空间、(" ")或根本不需要break;
  • 假设您使用的是java,我更喜欢使用框架方法lastIndexOf,因为:
代码语言:javascript
复制
1. it would start reading from right instead of left and assuming the numbers would be always less length than the string it would find index of space faster in most of the cases than reading from start.
2. 2nd benefit is that there are lots of scenarios framework/utilities method already handled so why to _reinvent the wheel_

int k = str.lastIndexOf(" ");

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

仅从文件中读取所需行

似乎您只需要一定数量的行来读取arrayInt.length,如果是这样的话,那么您应该“中断”;一旦计数器i超过数组长度,就应该“中断”while循环。

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

别忘了试着抓住-最后

该代码假设不会出现任何问题,并且可以在完成后关闭文件,但可能有n个组合会导致应用程序崩溃和锁定文件。

见下面的示例:

代码语言:javascript
复制
    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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53531572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档