Если оператор using == дает неожиданный результат

private void refineWords() { for(String word : words){ Log.i("word", word); if (word == "s" || word == "t" || word == "am" || word == "is" || word == "are" || word == "was" || word == "were" || word == "has" || word == "have" || word == "been" || word == "will" || word == "be" || word == "would" || word == "should" || word == "shall" || word == "must" || word == "can" || word == "could" || word == "the" || word == "as" || word == "it" || word == "they" || word == "their" || word == "he" || word == "she" || word == "his" || word == "her" || word == "him" || word == "its" || word == "in" || word == "on" || word == "a" || word == "at") { Log.i("step", "step Success!!"); words.remove(word); } } } 

У меня есть список, называемый «слова», и он содержит строки. Здесь Log.i работает для тега «word», но оператор «step» не выполняется. Кажется, условие If не работает хорошо. как этот метод никогда не входит в него, хотя список «слов» содержит похожие строки. В чем проблема. просьба помочь ..

Вам нужно использовать String.equals() , а не == . == проверяет, ссылаются ли две ссылки на объекты на один и тот же Object :

 if("s".equals(word) || "t".equals(word) || ... 

Из раздела 15.21.3 ссылочного равенства операторов == и = в спецификации языка Java 3.0:

В то время как == может использоваться для сравнения ссылок типа String, такой тест равенства определяет, ссылаются ли два операнда на один и тот же объект String. Результат является ложным, если операнды являются отличными объектами String, даже если они содержат одну и ту же последовательность символов. Содержимое двух строк s и t может быть проверено на равенство путем вызова метода s.equals (t).

Как говорили другие, вы используете object.equals(otherObject) для сравнения объектов в Java.

Но ваш подход совершенно неверен.

Попробуйте вместо этого

 Set stopWords = new HashSet(Arrays.asList("s", "t", "am", "is", "are", "was", "were", "has", "have", "been", "will", "be", ...)); 

а потом

 private void refineWords() { words.removeAll(stopWords); } 

и вы должны быть сделаны.


Кроме того, обратите внимание, что с вашим текущим кодом вы получите ConcurrentModificationException потому что вы пытаетесь изменить коллекцию во время ее итерации по ней.

Поэтому, если вы не можете использовать вышеуказанные слова words.removeAll(stopWords) , то вместо этого вы должны использовать гораздо более подробный метод Iterator.remove() :

 private void refineWords() { for (Iterator wordsIterator = words.iterator(); wordsIterator.hasNext(); ) { String word = wordsIterator.next(); if (stopWords.contains(word)) { wordsIterator.remove(); } } } 

В java вам нужно сравнить строки с equals :

 if(word.equals("s") ... 

вы можете использовать equalsIgnoreCase(..) для более тонкой обработки.

  • Когда метод finalize () вызывается в Java?
  • Установить и получить методы в java?
  • Неоднозначный вызов Varargs Java
  • Вызывать прямые методы или методы с аргументами / переменными / параметрами в EL
  • Если частные вспомогательные методы являются статическими, если они могут быть статическими
  • Как я могу получить значение переменной сеанса внутри статического метода?
  • Реализовать чистый виртуальный метод в Objective-C
  • Поддерживает ли Java внутренние / локальные / вспомогательные методы?
  • Что делает ключевое слово return в методе void в Java?
  • как добиться сцепления метода в java?
  • Как передать функцию-член функции указателю на функцию?
  • Давайте будем гением компьютера.