数组列表未正确搜索

时间:2011-02-16 00:45:52

标签: java arrays contains

我很难让这个工作。每次向数组添加某些内容时都会调用isLoop()方法,以确保没有重复项。当有重复时,它应该返回true。但事实并非如此。

isLoop(){
    if(!Arrays.asList(SQUARES).contains(sq)){
        return false;
    }else{
        return true;
    }
}

我是否遗漏了有关数组的基本信息?我对Java很新,所以可能就是这样! :d

修改

我被要求展示对象是如何实现的,所以我在这里发布了全班:

class Happy {
static int SQUARES[] = new int[10000];
static int sq;

public static boolean isHappy(int num){
    int s = 0;
    int n = num;

    int i=0;

    for(sq = num; (!isLoop()) && (sq > 1);){
        sq = addSquaresOfDigits(sq);
        SQUARES[i] = sq;
        i++;

    }

    if(isLoop()){
        return false;
    }else{
        return true;
    }
}

static int addSquaresOfDigits(int number) {
    int result = 0;
    int tmp;
    while(number > 0) {
        tmp = number % 10;
        result += tmp * tmp;
        number /= 10;
    }
return result;
}

static boolean isLoop(){
    if(!Arrays.asList(SQUARES).contains(sq)){
        return false;
    }else{
        return true;
    }
}

方法isHappy()将测试给定的数字,看它是否是happy number

5 个答案:

答案 0 :(得分:0)

确保在equals()课程中定义hashCode()sq。有关详细信息,请参阅this question

如果sq实例未实现equals(),那么它将使用Object中的默认实现来检查这两个对象是否是同一个实例。

答案 1 :(得分:0)

首先,您可以将代码简化为以下内容:

isLoop(){
    return Arrays.asList(SQUARES).contains(sq);
}

尽管您在其他地方已经说过,SQUARES必须是一个数组,而sq必须是Class的对象实例,否则您的代码将无法编译。

equals()的{​​{1}}方法在sq中的某个对象上调用时,SQUARES必须返回true才能返回true。

答案 2 :(得分:0)

考虑切换到某些Set实现(例如HashSet类)来搜索集合是否包含特定元素。它比循环遍历列表要快得多。甲

如上所述,请记住equals()hashcode()方法。

答案 3 :(得分:0)

您在评论中说明您没有覆盖equals()hashCode(),这将是您的问题,因为默认情况下(并且设计)Java不知道两个对象是否有意义相等(因为这将根据班级而有所不同!)

查看here,了解equals()hashCode()方法的优秀指南以及如何正确实施这些方法。或者,如果您感到懒惰,许多IDE将根据许多选定的字段为您实现它们。当你知道它们如何工作时,我只推荐这种方法!

顺便说一下,当HashSet是一个更好的选择时,似乎你在这里使用一个列表 - 通过设计它不包含重复项并且检测它们非常快(它不需要经过你正在这里检查它们的整个清单。)

答案 4 :(得分:0)

为什么要将SQUARES转换为列表,我认为使用contains方法,您正在使用此转换。

例如,考虑一下,如果你想得到一个值的索引,即 static int sq = 9;

Arrays.binarySearch(SQUARES,sq);  // returns the index at which the value 9 is present