有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

扫描文件| Java中的双精度数组

我正试图扫描一个包含双精度数组的文件。我正在使用下面的代码,但它只为每个条目输出0.0。这是为什么?我如何修复它

Scanner scanner = new Scanner("file.txt");
double[] array = new double[256 * 256];
for (int i = 0; i < array.length; i++) {
    if (scanner.hasNextDouble()) {
        array[i] = scanner.nextDouble();
    }
}
System.out.println(array[0]);

我正在扫描的文件的一个例子是

0.22131145 0.22131145 0.22131145 0.22841525 0.22841525 ...

共 (2) 个答案

  1. # 1 楼答案

    主要问题是Scanner对象的实例化。在这种情况下,您需要向其中传递一个File对象,而不仅仅是一个字符串,并确保指定了正确的文件路径。请向官方咨询意见

    其次,您需要使用while循环。if语句只执行一次,但您希望扫描程序在文件中有信息时继续查找

    第三,不要使用数组来存储值。这太危险了,因为您需要事先知道数组的大小,这意味着您需要循环两次,这将是低效的,或者您正在进行硬编码,就像您在这里所做的那样。如果有人在文件中添加或删除值,您将得到意外的结果。而是使用动态数据结构,例如List

    public static void main(String[] args) throws FileNotFoundException {
        String filepath = "file.txt";
        Scanner scanner = new Scanner(new File(filepath));
        List<Double> list = new ArrayList<>();
    
        while (scanner.hasNextDouble()) {
            list.add(Double.valueOf(scanner.next()));
        }
    
        scanner.close();
        System.out.println(list.get(0));
    }
    
  2. # 2 楼答案

    您的代码有四个问题:

    1. 阻止程序Scanner需要一个File对象,但您没有以这种方式使用它。您需要使用以下语法:

      Scanner scanner = new Scanner(new File("file.txt"));
      
    2. 性能:您可以通过在检查i值的条件中包含scanner.hasNextDouble()来提高程序的性能,如下所示:

      for (int i = 0; i < array.length && scanner.hasNextDouble(); i++) {
          array[i] = scanner.nextDouble();
      }
      

      这将在scanner.hasNextDouble()返回false时立即终止循环;否则,代码中的循环将继续运行,直到i < array.length的计算结果为false,而不考虑scanner.hasNextDouble()返回的值

    3. 资源泄漏:您尚未关闭Scanner对象。循环完成后,放置以下行:

      scanner.close();
      
    4. 功能缺失:您尚未打印完整的阵列。语句System.out.println(array[0])将只打印数组中的第一个元素。按如下所示进行更改以打印整个阵列:

      System.out.println(Arrays.toString(array));
      

      以下给出了包含上述所有评论的代码:

      import java.io.File;
      import java.io.FileNotFoundException;
      import java.util.Arrays;
      import java.util.Scanner;
      
      public class Main {
          public static void main(String[] args) throws FileNotFoundException {
              Scanner scanner = new Scanner(new File("file.txt"));
              double[] array = new double[256 * 256];
              for (int i = 0; i < array.length && scanner.hasNextDouble(); i++) {
                  array[i] = scanner.nextDouble();
              }
              scanner.close();
              System.out.println(Arrays.toString(array));
          }
      }
      
    5. 内存利用率:您使用了一个固定大小的数组,如果要存储的元素数等于数组的大小,那么这个数组就可以了。但是,如果不是这样(即,如果要存储的元素数量可以小于或大于指定的大小),则应使用Collection,例如ArrayList,这是一种动态数组。这将在许多方面对您有所帮助:(a)如果要存储的元素数量小于指定的大小,您将节省内存;(b)当您需要存储比已指定的元素更多的元素时,您不需要更改代码来增加数组的大小;(c)Collection提供了一个丰富的API来处理元素。通过利用此API,您的代码可以变得清晰、性能更高,等等

      下面给出了包含第5点的代码:

      import java.io.File;
      import java.io.FileNotFoundException;
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Scanner;
      
      public class Main {
          public static void main(String[] args) throws FileNotFoundException {
              Scanner scanner = new Scanner(new File("file.txt"));
              List<Double> list = new ArrayList<>();
              while (scanner.hasNextDouble()) {
                  list.add(scanner.nextDouble());
              }
              scanner.close();
              System.out.println(list);
          }
      }