Я удивлен, что никто не использовал reduce
, это встроенная краткая и мощная функция JavaScript.
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'));
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")
);
Объекты (такие как Integer
s) должны сравниваться не через ==
, а через .equals()
.
Важно понимать, что несколько различных Integer
объектов могут представлять одно и то же значение int. Когда ваша программа печатает >>> different
, она просто говорит, что первый объект не является тем же объектом , что и второй объект. (Хотя вы, вероятно, хотите сравнить объекты на основе того, какое значение они представляют.)
Из официального руководства по автобоксу:
[. ..] Оператор == выполняет сравнения ссылочных идентификаторов в выражениях Integer и сравнения равенства значений в выражениях int. [...]
Возможно, стоит отметить, что автобокс гарантированно возвращает тот же объект для целочисленных значений в диапазоне [-128, 127], но реализация может, в по своему усмотрению, значения кэша за пределами этого диапазона.
Моя общая рекомендация - использовать int
вместо Integer
для всех локальных переменных / переменных-членов. В этом конкретном случае вы, кажется, храните координаты в массиве из 2 элементов. Я бы посоветовал вам инкапсулировать это в класс Coordinates
или аналогичный и переопределить здесь метод equals (и hashCode).
См. Также
Если бы они были простыми int
типами, это бы сработало.
Для Integer
используйте .intValue()
или compareTo(Object other)
или equals(Object other)
в своем сравнении.
Когда вы пытаетесь сравнить два объекта (а Integer - это объект, а не переменная), результатом всегда будет то, что они не равны,
в вашем случае вы должны сравнить поля объектов (в данном случае intValue)
попробуйте объявить переменные int вместо объектов Integer, это поможет