使用for循环在数组中查找缺失值

时间:2014-11-05 18:48:42

标签: java

所以我试图创建一个搜索数组的for循环,并返回它找到的缺失值。

这是我的方法:

    public void questionsMissed() {
            int missedQuestions = 0;
            for (int i = 0; i < 20; i++) {
                if (answers[i] == null){
                    missedQuestions++;
                }
            }
 System.out.println("You have missed " + missedQuestions + " questions.");
        }

错误是if语句的位置。我假设它是因为null。我怎样才能找到缺失值?

错误:无法比较的类型:int和

3 个答案:

答案 0 :(得分:3)

您收到错误是因为您尝试将原始数据类型intnull进行比较。只能将引用类型与null进行比较。原始类型总是有一个值 - 它们不能是null,因此编译器会告诉您比较没有意义。

有两种方法可以解决这个问题:

  • answers的类型切换为Integer - 这样可以检查null的值,但代价是将原始整数包装成 - 参考包装。
  • 您可以将整数值(例如-1)指定为“缺失” - 这样可以将int保留为answer[]元素的类型,但是会有一个特殊的号码必须在你的程序中的任何地方使用。

由于您使用char值作为答案,我会使用第二种方法,但首先我会制作answerscorrectAnswers char数组。未使用的值有一个方便的“特殊值” - 空字符\0'

if (answers[i] == '\0') {
    ...
}

答案 1 :(得分:2)

两件事: -

没有什么比缺少值可以使用null进行比较。您可以将它与0进行比较,因为那些定义的数组成员初始化为0(感谢dasblinkenlight以纠正我,我与C混淆),但这似乎是一个糟糕的决定/选择。

我建议为缺失值设置-1,这通常在哨兵条件检查中进行,然后比较以下值: -

public void questionsMissed() {
    int missedQuestions = 0;
    for (int i = 0; i < 20; i++) {
        if (answers[i] == -1){
          System.out.println("OOPS,the element here is missing!");
        }
    }
}

答案 2 :(得分:1)

您将基本类型intnull进行比较。原始类型不是对象,并且始终具有值。因此,您无法将它们与null进行比较。

如果您使用Integer[],可以通过插入null来标记遗漏的问题,也可以将其与&#39; \ 0&#39;进行比较。

但由于你已经使用了字符文字,我会使用Character代替。

当您使用原始包装类型时,您的方法也会变得更加容易。 E.g。

Character[] answers = new Character[20];

....

public void questionsMissed() {
    int missedQuestions = Collections.frequency(Arrays.asList(answers), '\0');
    System.out.println("You have missed " + missedQuestions + " questions.");
}