【问题标题】:Java Program: Where am I going wrong?Java 程序:我哪里出错了?
【发布时间】:2014-03-01 02:54:56
【问题描述】:

问题:编写一个读取实数列表的程序。程序结束后,它应该只打印出唯一的数字。也就是说,只有在列表中出现一次的数字。如果列表中的唯一编号超过 50 个,那么您应该只打印前 50 个。

import java.util.*;
import java.io.*;
import java.util.Arrays;


public class Hmwk {

public static void main(String[] args) throws FileNotFoundException {
    Scanner input=new Scanner (new File ("input.txt"));
    int n = 0;
    final int MAX_SIZE = 50;
    double[] numbersArray = new double[MAX_SIZE];
    while (input.hasNextDouble() && n<MAX_SIZE){
        double in = input.nextDouble();
        if (!inList(in,numbersArray)){
            numbersArray[n]=in;
            n++;
        }
    }
    double[] uniqueArray = Arrays.copyOfRange(numbersArray, 0, n);
    printReport(uniqueArray);
}


public static boolean inList(double number, double[] list){
    for (double i : list)
        {
            if (Math.abs(i-number) <0.00000000001){
                return true;
        }

    }
    return false;
}


public static void printReport(double[] list)
{
    System.out.println("The unique numbers were");
    System.out.println(Arrays.toString(list));

}


}

它运行良好,但我似乎无法弄清楚我的逻辑哪里出了问题。我正在针对 5 6 7 8 9 0 9 8 0 的 input.txt 运行它,我的输出是

The unique numbers were
[5.0, 6.0, 7.0, 8.0, 9.0]

我和我的室友似乎无法确定我的问题。我认为我已经解释了可能犯的每一个错误,但是计算机更擅长做你告诉他们做的事情,而不是你想让他们做的事情。如果有人能查明我的问题并告诉我如何解决它,我将永远感激不尽。感谢您的宝贵时间。

【问题讨论】:

  • 你为什么在 inList 中使用
  • Mdewitt:它是为了处理整数-> 双精度数,教授告诉我的。
  • 那么具体的问题是什么?没有0.0
  • Tyler- 它们都是整数。如 5 6 7 等
  • 您在添加之前检查每个号码是否在列表中。因此,您将始终添加每个数字的第一个实例。你需要重新考虑你的算法。

标签: java arrays if-statement while-loop


【解决方案1】:

将数字添加到列表中一次,而不是寻找唯一数字。这就是区别。 (顺便说一句:0.0 没有出现在输出中的原因是因为数组默认全是零。)

基本上你应该有这个:

  1. 读取数组中的所有数字。
  2. 遍历该列表中的每个数字,并检查它是否唯一。
  3. 如果是这样,请将其添加到最终数组中。

检查一个元素是否唯一可以简单地通过再次循环计算该元素在整个列表中的出现次数来完成。

【讨论】:

  • 如果数组已经包含给定的数字,则不会将数字添加到数组中(这就是 inList 的用途)。所以数组只会包含唯一的数字(除了0)。
  • 我知道,这就是我告诉他的。为什么所有的反对票?这是正确的答案。他只想选择唯一的数字。他不想让每个数字在最终结果中出现一次。
  • @Njol 该数组将包含唯一的数字,但它不会只包含输入中唯一的数字。这个答案解决了这个问题。
【解决方案2】:

(只是部分问题,抱歉。其余的请参见其他答案)

数组在创建时用零填充,因此零将始终为inList。您可以将该函数更改为仅通过添加列表长度参数来检查实际设置的值:

public static boolean inList(double number, double[] list, int n){
    for (int i = 0; i < n; i++)
        if (Math.abs(line[i] - number) < 0.00000000001)
            return true;
    return false;
}

顺便说一句:您还可以使用 ArrayList&lt;Double&gt;HashSet&lt;Double&gt; 来处理可变数组大小。

【讨论】:

  • 不能解决输出 8 和 9 的问题