Список массивов не ищется должным образом - PullRequest
0 голосов
/ 16 февраля 2011

Мне трудно заставить это работать.Метод 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 () проверит заданное ему число, чтобы увидеть, является ли оно счастливым числом или нет.

Ответы [ 5 ]

0 голосов
/ 16 февраля 2011

Почему вы конвертируете SQUARES в список, я думаю, что для использования метода contains вы используете это преобразование.

Например, рассмотрим, хотите ли вы получить индекс значения, т.е. static int sq = 9;

Arrays.binarySearch(SQUARES,sq);  // returns the index at which the value 9 is present
0 голосов
/ 16 февраля 2011

В комментарии вы не указали equals() или hashCode(), это будет вашей проблемой, так как по умолчанию (и по замыслу) Java не знает, являются ли два объекта значимо равными (поскольку это будет отличаться)в зависимости от класса!)

Посмотрите здесь , чтобы найти хорошее руководство по методам equals() и hashCode() и как правильно их реализовать.В качестве альтернативы, если вам лень, многие IDE реализуют их для вас на основе нескольких выбранных полей.Я бы порекомендовал этот подход, только когда вы знаете, как они работают!

Кроме того, кажется, что вы используете список здесь, когда HashSet был бы гораздо лучшим выбором - по своей конструкции он несодержат дубликаты и очень быстро обнаруживают их (не нужно проходить весь список, чтобы проверить их, как вы делаете здесь.)

0 голосов
/ 16 февраля 2011

Для начала вы можете упростить свой код до следующего:

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

Несмотря на то, что вы сказали в другом месте, SQUARES должен быть массивом, а sq должен быть экземпляром объекта класса, иначе ваш код не будет компилироваться.

Метод equals() sq должен будет возвращать true при вызове одного из объектов в SQUARES, чтобы isLoop() возвращал true.

0 голосов
/ 16 февраля 2011

Рассмотрите возможность переключения на некоторую реализацию Set (например, HashSet class) для поиска, содержит ли коллекция определенный элемент или нет.Это намного быстрее, чем перебирать список.A

Как уже упоминалось ранее, помните о equals() и hashcode() методах.

0 голосов
/ 16 февраля 2011

Убедитесь, что вы определили equals() и hashCode() в классе sq.См. этот вопрос для получения подробной информации об этом.

Если экземпляр sq не реализует equals(), тогда он будет использовать реализацию по умолчанию в Object, которая должна проверить, является лидва объекта - это один и тот же экземпляр.

...