Why Java does not see that Integers are equal?

Я удивлен, что никто не использовал reduce , это встроенная краткая и мощная функция JavaScript.

ES6 (EcmaScript2015)

String.prototype.format = function() {
  return [...arguments].reduce((p,c) => p.replace(/%s/,c), this);
};

console.log('Is that a %s or a %s?... No, it\'s %s!'.format('plane', 'bird', 'SOman'));

< ES6

function interpolate(theString, argumentArray) {
    var regex = /%s/;
    var _r=function(p,c){return p.replace(regex,c);}
    return argumentArray.reduce(_r, theString);
}

interpolate("%s, %s and %s", ["Me", "myself", "I"]); // "Me, myself and I"

Как это работает:

уменьшение применяет функцию к аккумулятору и каждому элементу в массиве (слева направо), чтобы уменьшить это к одному значению.

var _r= function(p,c){return p.replace(/%s/,c)};

console.log(
  ["a", "b", "c"].reduce(_r, "[%s], [%s] and [%s]") + '\n',
  [1, 2, 3].reduce(_r, "%s+%s=%s") + '\n',
  ["cool", 1337, "stuff"].reduce(_r, "%s %s %s")
);

24
задан aioobe 13 December 2010 в 14:53
поделиться

3 ответа

Объекты (такие как Integer s) должны сравниваться не через ==, а через .equals().

Важно понимать, что несколько различных Integer объектов могут представлять одно и то же значение int. Когда ваша программа печатает >>> different, она просто говорит, что первый объект не является тем же объектом , что и второй объект. (Хотя вы, вероятно, хотите сравнить объекты на основе того, какое значение они представляют.)

Из официального руководства по автобоксу:

[. ..] Оператор == выполняет сравнения ссылочных идентификаторов в выражениях Integer и сравнения равенства значений в выражениях int. [...]

Возможно, стоит отметить, что автобокс гарантированно возвращает тот же объект для целочисленных значений в диапазоне [-128, 127], но реализация может, в по своему усмотрению, значения кэша за пределами этого диапазона.

Моя общая рекомендация - использовать int вместо Integer для всех локальных переменных / переменных-членов. В этом конкретном случае вы, кажется, храните координаты в массиве из 2 элементов. Я бы посоветовал вам инкапсулировать это в класс Coordinates или аналогичный и переопределить здесь метод equals (и hashCode).

См. Также

59
ответ дан 28 November 2019 в 22:21
поделиться

Если бы они были простыми int типами, это бы сработало.

Для Integer используйте .intValue() или compareTo(Object other) или equals(Object other) в своем сравнении.

12
ответ дан 28 November 2019 в 22:21
поделиться

Когда вы пытаетесь сравнить два объекта (а Integer - это объект, а не переменная), результатом всегда будет то, что они не равны,

в вашем случае вы должны сравнить поля объектов (в данном случае intValue)

попробуйте объявить переменные int вместо объектов Integer, это поможет

1
ответ дан 28 November 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: