Во-первых, как уже упоминалось в другом ответе, используйте .equals()
вместо ==
в этом случае.Еще лучше, вам даже не нужно использовать Map
.Достаточно будет только одно целое число.
Поскольку ваш вопрос ...returning false for big numbers, can someone tell me why?
Вот причина.
Есть несколько вещей, которые вам необходимо понять
1.Типы переменных
Во-первых, вам нужно знать, что в Java есть два типа переменных: Primitive и Reference.
Обычно целое число - это Primitive, поэтому сама переменная является целочисленным значением:int a = 1234;
: a
само по себе имеет значение 1234.
Чтобы сравнить примитивную переменную, вы должны использовать ==
Для ссылочного типа сама переменная является «указателем».В Java есть классы Wrapper для примитивов.Например, Integer
- это оболочка для int
.Так в Integer a = new Integer(1234);
, a
не содержится значение 1234
.Это указатель, указывающий на Integer
ссылку на объект.Использование ==
для переменных ссылочного типа не сравнивает содержимое, а только проверяет, совпадает ли значение указателя (т. Е. Проверяет, указывают ли они на один и тот же экземпляр объекта)
2.Автобокс
Начиная с Java 1.5 (iirc), существует функция, называемая автобоксом (и распаковкой), которая облегчает программисту преобразование между примитивными типами и соответствующими им оболочками.
В прошлом, вам нужно сделать что-то вроде этого:
int a = 1234;
Integer intWrapper = new Integer(a);
int b = intWrapper.intValue();
С автобоксом вам просто нужно написать:
int a = 1234;
Integer intWrapper = a;
int b = intWrapper;
И компилятор собирается преобразовать его в:
int a = 1234;
Integer intWrapper = Integer.valueOf(a);
int b = intWrapper.intValue();
Пока все хорошо?
Окончательный ответ
Итак, причина, по которой ваш код работает с небольшим числом: Integer.valueOf()
кеширует часто используемое значение.Из API doc:
public static Integer valueOf (int i)
Возвращает экземпляр Integer, представляющий указанное значение типа int.Если новый экземпляр Integer не требуется, этот метод обычно следует использовать в предпочтении перед конструктором Integer (int), поскольку этот метод, вероятно, даст значительно лучшую производительность пространства и времени за счет кэширования часто запрашиваемых значений. Этот метод всегда будет кэшировать значения в диапазоне от -128 до 127 включительно и может кэшировать другие значения вне этого диапазона.
Поскольку он кэширует оболочки, поэтому, есливы делаете map.put(key,map.get(key) + 1)
, результат get(key) + 1
, который равен int
, при преобразовании в Integer
и, если это небольшое число, будет таким же экземпляром Integer
для того же значения int
.Это означает, что ==
все еще работает (поскольку переменные указывают на одно и то же Integer
).Однако, если это не кэшированное число, каждый вызов будет другим экземпляром, и ==
не будет работать (поскольку переменные указывают на разные экземпляры Integer
, хотя значения в Integer
экземплярах одинаковы)
Предложение к вашему алгоритму, хотя и немного не по теме:
Ваша логика слишком сложна.Это может быть значительно упрощено до (псевдокод):
countValley(String s) {
currentLevel = 0
valleyCount = 0
for (step in s) {
if step == 'U' {
++currentLevel;
if (currentLevel == 0) { // returning to sea level
++valleyCount
}
} else if step == 'D' {
--currentLevel;
}
}
return valleyCount
}