【问题标题】:Store ints into array from a file and find mean JAVA将整数从文件存储到数组中并找到平均 JAVA
【发布时间】:2013-03-09 20:37:26
【问题描述】:

在此程序中,您将找到一个菜单,其中包含在阵列上执行不同功能的选项。该数组取自一个名为“data.txt”的文件。该文件包含整数,每行一个。我想创建一个将这些整数存储到数组中的方法,以便在需要完成计算时调用该方法。显然,我没有包含整个代码(太长了)。但是,我希望有人可以帮助我解决计算平均值的第一个问题。现在,控制台打印 0 表示平均值,因为除了文件中的 1、2、3 之外,数组的其余部分都用 0 填充。我想要的平均值是 2。欢迎提出任何建议。我的程序的一部分如下。谢谢。

public static void main(String[] args) throws FileNotFoundException {
    Scanner sc = new Scanner(System.in);
    System.out.println("Welcome to Calculation Program!\n");
    startMenus(sc);

}

private static void startMenus(Scanner sc) throws FileNotFoundException {
    while (true) {
        System.out.println("(Enter option # and press ENTER)\n");

        System.out.println("1. Display the average of the list");
        System.out.println("2. Display the number of occurences of a given element in the list");
        System.out.println("3. Display the prime numbers in a list");
        System.out.println("4. Display the information above in table form");
        System.out.println("5. Save the information onto a file in table form");
        System.out.println("6. Exit");

        int option = sc.nextInt();

        sc.nextLine();

        switch (option) {
            case 1:
                System.out.println("You've chosen to compute the average.");
                infoMenu1(sc);
                break;
            case 2:
                infoMenu2(sc, sc);
                break;
            case 3:
                infoMenu3(sc);
                break;
            case 4:
                infoMenu4(sc);
                break;
            case 5:
                infoMenu5(sc);
                break;
            case 6:
                System.exit(0);
            default:

                System.out.println("Unrecognized Option!\n");
        }

    }
}

private static void infoMenu1(Scanner sc) throws FileNotFoundException {
    File file = new File("data.txt");
    sc = new Scanner(file);

    int[] numbers = new int[100];

    int i = 0;

        while (sc.hasNextInt()) {
            numbers[i] = sc.nextInt();
            ++i;
        }

    System.out.println("The average of the numbers in the file is: " + avg(numbers));
}

public static int avg(int[] numbers) {
    int sum = 0;
    for (int i = 0; i < numbers.length; i++) {
        sum = (sum + numbers[i]);
    }
    return (sum / numbers.length);
}

【问题讨论】:

    标签: java arrays java.util.scanner average


    【解决方案1】:

    只需将您的方法修改如下:
    public static int avg(int[] numbers, int len) 其中len 是实际存储的数字。
    在你的情况下,你打电话:

    System.out.println("The average of the numbers in the file is: " + avg(numbers, i));  
    

    在你的平均代码中:

     for (int i = 0; i < len; i++) {
            sum = (sum + numbers[i]);
        }  
    

    即将numbers.length 替换为传入的len

    然后return (sum / len);

    【讨论】:

    • 你需要除以len 而不是numbers.length
    【解决方案2】:

    您可以使用动态大小的List,而不是使用静态大小的数组:

    import java.util.List;
    import java.util.LinkedList;
    
    // . . .
    
    private static void infoMenu1(Scanner sc) throws FileNotFoundException {
        File file = new File("data.txt");
        sc = new Scanner(file);
    
        List<Integer> numbers = new LinkedList<Integer>();
    
        while (sc.hasNextInt()) {
            numbers.add(sc.nextInt());
        }
    
        System.out.println("The average of the numbers in the file is: " + avg(numbers));
    }
    
    public static int avg(List<Integer> numbers) {
        int sum = 0;
        for (Integer i : numbers) {
            sum += i;
        }
        return (sum / numbers.size());
    }
    

    这增加了允许您读取 100 多个数字的好处。由于LinkedList 允许您在恒定时间内执行任意数量的add 操作,因此在读取输入之前您无需知道有多少个数字(甚至是计数的上限)。

    正如 kkonrad 还提到的,您可能真的想使用浮点值,也可能不想使用浮点值作为平均值。现在你正在做整数运算,这意味着12 的平均值是1。如果您想要1.5,则应考虑使用double 来计算平均值:

    public static double avg(List<Integer> numbers) {
        double sum = 0;
        for (Integer i : numbers) {
            sum += i;
        }
        return (sum / numbers.size());
    }
    

    【讨论】:

    • 我不熟悉“列表”。我将进一步研究。并感谢您关于将我的平均方法更改为双倍回报的建议。
    • @lancer - 是的,如果你打算用 Java 做很多工作,你真的需要熟悉 Collections Framework。这包括您需要的所有典型数据结构(列表、映射、队列、双端队列、集合......)。
    【解决方案3】:

    我认为 sum 应该是一个 doubledouble 应该是你的 avg 函数的返回类型

    【讨论】:

    • 该文件不包含任何双打。如果我确实将 sum 更改为 double,它仍然会用 0.0 填充空索引
    • 当然,java 会将未初始化的原始类型数组填充为默认值......这就是为什么在加载时应该使用 List 而不是将数据移动到数组。您也可以使用 Integer[] 以便空值为 null ...主要问题是,当您划分整数时,您将得到 int ...
    • 这是有道理的。谢谢你的建议。我将相应地更改我的平均方法,以便获得更精确的整数运算值。
    【解决方案4】:

    请以这种方式更改您的平均函数

      private static void infoMenu1(Scanner sc) throws FileNotFoundException {
        .
        .
        .
        System.out.println("The average of the numbers in the file is: " + avg(numbers,i));
      }
    
      public static int avg(int[] numbers,int length) {
        int sum = 0;
        for (int i = 0; i < length; i++) {
            sum = (sum + numbers[i]);
    
        }
        return (sum / length);
    }
    

    在调用平均函数时,通过 i (您在 infoMenu1 中计算 data.txt 中的条目数) 并在循环中使用它并除以总和。这样,您的循环将不会运行 100 次迭代,并且代码行数也会减少。

    【讨论】:

    • Cratylus 在上面提出了类似的建议,它确实以我需要的方式发挥作用。感谢您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多