Java: сравнить значения объекта - PullRequest
0 голосов
/ 09 июля 2009

Я пытаюсь сравнить значение 2 экземпляров x внутри итератора.

x - это ссылочный тип, содержащий свои собственные элементы данных. Я пытаюсь сравнить один экземпляр x с другим, чтобы определить, совпадают ли значения внутри каждого.

if (x.equals (x))

продолжает оценивать значение true, когда на самом деле значение каждого экземпляра x отличается.

Приветствие.

Ответы [ 6 ]

8 голосов
/ 09 июля 2009

Если ваш код на самом деле не выглядит так

X x = new X();
if(x.equals(x))

но больше похоже на

X x = new X();
X y = new X();

if(x.equals(y)) { }

И вы получаете неправильные значения для x.equals(y), тогда ваша реализация equals нарушена.

Перейдите к вашему Class X и проверьте, как реализован метод equals. Если это не реализовано в X, проверьте в суперклассе.

1 голос
/ 09 июля 2009

На этот вопрос сложно ответить, учитывая детали. Они должны быть объектами, а не примитивами, чтобы иметь метод .equals. Так был ли переопределен метод equals таким образом, что это приводит к ошибочным сравнениям? Это было бы то место, на которое я бы посмотрел.

0 голосов
/ 09 июля 2009

Если вы решили переопределить равно (), также переопределите хэш-код ()

0 голосов
/ 09 июля 2009

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

class Square
{
    public int length;

    public boolean equals( Square s )
    {
        return this.length == s.length;
    }
}
0 голосов
/ 09 июля 2009

Метод equals в классе Object выполняет операцию, равную экземпляру. однако подклассы Object обычно переопределяют этот метод для выполнения операции относительного равенства, когда значения в целевом объекте проверяются на соответствие значениям рассматриваемого объекта. В вашем случае вы, скорее всего, используете подкласс Object, который переопределил метод equals. Было бы хорошо узнать, как реализован метод equals вашего класса X.

0 голосов
/ 09 июля 2009

Похоже, вы сравниваете ссылки, а не данные.

EDIT: Из документа API для объекта: «Метод equals для класса Object реализует максимально различающее возможное отношение эквивалентности для объектов; то есть для любых ненулевых ссылочных значений x и y этот метод возвращает true, если и только если x и y ссылаются на один и тот же объект (x = = y имеет значение true). "

например. Если «X» или его родительские классы не переопределяют equals, тогда, когда вы вызываете equals, он будет сравнивать ссылки, которые, если они являются одним и тем же объектом, всегда будут равны.

Судя по звукам, вам необходимо переопределить метод equals в классе 'X', но опять же, что вы говорите, похоже, указывает на то, что они в любом случае являются одной и той же ссылкой?

...