【问题标题】:Read from text file, then assign values to an array [closed]从文本文件中读取,然后将值分配给数组 [关闭]
【发布时间】:2019-04-02 22:40:04
【问题描述】:

我的班级项目是提示用户输入一个文件,他们输入的那个文件名必须是正确的,一旦文件建立起来,文件的第一行就是数组的大小。然后,我必须将每个值逐行分配给数组。

快速说明**我们还没有了解缓冲阅读器,所以我不能使用它。我也不能用ArrayList,还没有讲到。

问题:我如何确保他们输入的文件名是正确的?到目前为止,我们在课堂上使用了 while 循环来检查,但我想知道是否有更好的方法。我需要用户输入“investments.txt”,否则我需要一次又一次地提示他们。也非常感谢改进现有代码的任何要点,我对此很陌生。

到目前为止的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
public class Prog07_InvestmentManager {

    public static void main(String[] args) {

    Scanner in = new Scanner(System.in);    

    System.out.println("Please enter the file name to import. Example: Investments.txt."); //prompt user
    File file = new File(in.nextLine());

    try {
        Scanner inFile = new Scanner(new FileReader("investments.txt"));
        double min = Integer.MAX_VALUE;
        double max = 0;
        double mean = 0;
        int num = inFile.nextInt();
        inFile.nextLine();

        double line = 0;
        int sum = 0;
        int count = 0;

        while (inFile.hasNextLine()) {

            line=inFile.nextDouble();
            sum+=line;
            count++;

            if(line>max)
                max=line;

            if(line<min)
                min=line;
        }
        mean = (sum/count);
        System.out.println("Max: "+max);
        System.out.println("Min: "+min);
        System.out.println("Mean: "+mean);
        System.out.println();
    } catch (FileNotFoundException e1) {

    }
    if (in.hasNextDouble()) {

    double[] values = new double [(int) in.nextDouble()];

    }

    try {
        Scanner inputFile = new Scanner(file);

        double[] arr = new double[(int) in.nextDouble()];

        for (int i = 0; in.hasNextDouble(); i++) {
            arr[i] = in.nextDouble();
        }

    } catch (FileNotFoundException e) {
        file = new File("investments.txt");
        System.out.print("File not found.\nPlease enter the correct path if needed.");
        file = new File(in.nextLine());                 
        }
    in.close();
    }
}

【问题讨论】:

  • 请将您的问题缩小到您遇到问题的特定代码部分
  • 我已将我的问题缩小到一个,我真诚地道歉,因为这个地方到处都是。

标签: java arrays file


【解决方案1】:

所以你的代码有几个问题:

  1. 读入文件名后,您现在应该完成“in”扫描仪了。您正尝试从 System.in 开始读取数据,这将导致您的程序挂起,除非您手动输入所有数据。

  2. 您永远不会用 System.in 中的字符串覆盖您的原始文件变量。您甚至不一定需要默认值开始。 只需删除File file = new File("investments");String fileName = in.nextLine();

    然后在提示后添加File file = new File(in.nextLine());

  3. try/catch 之外的 while 循环也有问题,可以完全删除。同样,您正在尝试从 System.in 中读取所有数据。

  4. 您的 hasNextDouble() 和 .nextLine() 不匹配。这适用于您当前的设置,因为每个数字都在一个新行上,但通常您应该使用相同的数据类型。

  5. 通常,您可以使用以下命令从文件中读取双精度数组:

   Scanner scanner = new Scanner(file);
   double arr = new double[scanner.nextInt()];

   for(int i = 0; scanner.hasNextDouble(); i++) {
       arr[i] = scanner.nextDouble();
   }
   scanner.close();

【讨论】:

  • 谢谢,这实际上有很大帮助。我的主要问题是获取值并将它们粘贴在数组中。我想直言不讳,我不明白它是如何工作的,反正也不完全明白。我理解 'nextLine' 是逐行进行的,所以向我解释的方式是,只要我正确使用 nextLine,我就可以使用它来为数组赋值,对吗?
【解决方案2】:

第一个建议是使用 List 接口,而不是原始数组

List&lt;Double&gt; value = new ArrayList&lt;&gt;();

1 & 2 可以通过对列表进行排序轻松完成,第一个和最后一个元素分别是最小值和最大值。

之后,这只是一个问题或使用foreach循环查找其他值

for (Double element : value) {
   // do math
}

【讨论】:

  • 感谢您的意见!不幸的是,我们还没有在我的课堂上介绍数组列表,所以我不能使用它。
  • 你可以在原始数组中做同样的事情,只需使用 Arrays.sort()。和 foreach 循环基本相同
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 2015-05-25
  • 2015-01-13
  • 2020-03-19
  • 2013-08-07
  • 1970-01-01
  • 2012-10-09
  • 2013-03-27
相关资源
最近更新 更多