读取文本文档数据填入数组的问题

用以下代码阅读以下文本文档内容,为什么i的值最终是1?
60.0 F K
70.0 F R
30.0 f c
50.5 C F
60.5 C K
70.5 C R
20.0 K F
30.0 K C
40.0 K R
20.5 R F
30.5 R C
40.5 R K
0.0 D f
0.0 C f
25.3 a k
27 f a
54 f c
20 k c


try {
                                        String fileName;
                                        in = new Scanner(System.in);
                                        System.out.print("Please enter a file name: ");
                                        fileName = in.next();
                                        File inputFile = new File(fileName);
                                        in = new Scanner(inputFile);
                                        double[] temps = new double[100];
                                        char[] scales = new char[100];
                                        char[] newScales = new char[100];
                                        int i = 0, j = 0, k = 0;
                                        while(in.hasNextDouble()){
                                          temps[i] = in.nextDouble();
                                          i++;
                                        }
                                        in = new Scanner(inputFile);
                                        while (in.hasNext()){
                                            scales[j]=in.next().charAt(0);
                                            in.next();
                                            j++;
                                        }
                                        in = new Scanner(inputFile);
                                        while(in.hasNext()){
                                            in.next();
                                            newScales[k] = in.next().charAt(0);
                                            k++;
                                        }
                                        TemperatureConversion conversion = new TemperatureConversion();
                                        double[] newTemps = new double[100];
                                        for(int a = 0; a <= i; a++){
                                          newTemps[a] = conversion.doConversion(temps[a],scales[a],newScales[a]);
                                          if (newTemps[a] == 0){
                                              System.out.println("error invalid original scale specified " + scales[a]);
                                          }else{
                                              System.out.println(temps[a]+""+ scales[a] + " is " + newTemps[a] + newScales[a]);
                                          }
                                        }

                                }catch (IOException exception){
                                    exception.printStackTrace();
                                }

第一列是double类型,但是后面的是字符类型,所以第一个循环只满足一次,就结束了。

try {
     String fileName;
     in = new Scanner(System.in);
     System.out.print("Please enter a file name: ");
     fileName = in.next();
     File inputFile = new File(fileName);
      in = new Scanner(inputFile);
      double[] temps = new double[100];
      char[] scales = new char[100];
      char[] newScales = new char[100];
      int i = 0, j = 0, k = 0;
      while(in.hasNextDouble()){
       temps[i] = in.nextDouble();
       scales[i]=in.next().charAt(0);
       newScales[i] = in.next().charAt(0);
       i++;
      }
      TemperatureConversion conversion = new TemperatureConversion();
                                        double[] newTemps = new double[100];
                                        for(int a = 0; a < i; a++){
                                          newTemps[a] = conversion.doConversion(temps[a],scales[a],newScales[a]);
                                          if (newTemps[a] == 0){
                                              System.out.println("error invalid original scale specified " + scales[a]);
                                          }else{
                                              System.out.println(temps[a]+""+ scales[a] + " is " + newTemps[a] + newScales[a]);
                                          }
                                        }
                                }catch (IOException exception){
                                    exception.printStackTrace();
                                }

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据提供的代码和文本文档内容,i的最终值是1的原因是因为在第一个while循环中,只有一个数字60.0被读取到temps数组中,而后面的文本内容并不是以double类型的数字开头,所以循环在读取到60.0后就终止了。

具体来说,第一个while循环的目的是将文本文档中的数字读取到temps数组中。然而,第一个while循环仅在遇到下一个double类型的数字之前运行。在这种情况下,60.0是唯一一个满足条件的数字。

由于只有一个数字被读取到temps数组中,所以i的最终值是1。

如果你希望读取所有的数字并将它们存储到temps数组中,你可以修改代码如下:

while (in.hasNextDouble()) {
    temps[i] = in.nextDouble();
    i++;
    in.next(); // 读取数字后的空格或其他分隔符
}

通过在读取数字后使用in.next()来跳过数字后的分隔符,可以确保循环继续读取下一个数字并将其存储到temps数组中。这样,i的值将反映实际读取的数字数量。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 参考这个,一次读取将文件读取到数组
             while(in.hasNext()){
                                if((m-3)%3==0){
                                    temps[i] = in.nextDouble();
                                    ++i;
                                    ++m;
                                    continue;
                                }
                                if((m-1)%3==0){
                                    scales[j]=in.next().charAt(0);
                                    ++j;
                                    ++m;
                                    continue;
                                }

                                if((m-2)%3==0){
                                    newScales[k] = in.next().charAt(0);
                                    ++k;
                                    ++m;
                                    continue;
                                }


                            }

【以下回答由 GPT 生成】

问题的原因是在第二个while循环中,使用了两次in.next()方法,并且没有对第二次调用的返回值进行处理,导致每次都跳过了一个值。因此,变量j的值增加了,但填充数组scales的时候每次都会跳过一个值。

要解决这个问题,你可以不使用第二个while循环,而是在第一个while循环中同时填充两个数组。具体步骤如下:

  1. 首先,将第一个while循环的代码修改为如下形式,这样可以同时填充temps和scales数组:
while (in.hasNextDouble()) {
    temps[i] = in.nextDouble();
    scales[i] = in.next().charAt(0);
    i++;
}
  1. 然后,将temps和scales数组的大小修改为实际填充的数量,而不是固定的100。可以通过i的值来确定填充的数量。具体步骤如下:
double[] temps = new double[i];
char[] scales = new char[i];

这样,temps数组和scales数组就会正确地填充所有的数据。最终,变量i的值将等于实际填充的数量。

下面是修改后的代码:

try {
    String fileName;
    Scanner in = new Scanner(System.in);
    System.out.print("请输入文件名: ");
    fileName = in.next();
    File inputFile = new File(fileName);
    in = new Scanner(inputFile);
    int i = 0;
    while (in.hasNextDouble()) {
        temps[i] = in.nextDouble();
        scales[i] = in.next().charAt(0);
        i++;
    }

    double[] temps = new double[i];
    char[] scales = new char[i];

    in.close();

    // 使用填充好的temps和scales数组进行其他操作

} catch (FileNotFoundException e) {
    System.out.println("文件未找到");
}

这样,你就可以正确地读取文本文档中的数据,并将其填入相应的数组中,并且变量i的值将等于实际填充的数量。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^