如果使用==语句会产生意外的结果
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); } } }
我有一个名为“单词”的列表,它包含string。 在这里,Log.i适用于“单词”标签,但“步”语句不会执行。 似乎如果条件不好。 像这个方法永远不会进入它,虽然“单词”列表包含类似的string。 会是什么问题。 请帮忙
你需要使用String.equals()
,而不是==
。 ==
检查两个Object
引用是否引用同一个Object
:
if("s".equals(word) || "t".equals(word) || ...
从Java语言规范3.0的第15.21.3节引用平等运算符==和!=开始 :
虽然==可能用于比较Stringtypes的引用,但是这样的相等性testing确定两个操作数是否引用相同的String对象。 如果操作数是不同的String对象,则结果为false,即使它们包含相同的字符序列。 通过方法调用s.equals(t)可以testing两个strings和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<String> wordsIterator = words.iterator(); wordsIterator.hasNext(); ) { String word = wordsIterator.next(); if (stopWords.contains(word)) { wordsIterator.remove(); } } }
在Java中,你需要比较string与equals
:
if(word.equals("s") ...
您可能希望使用equalsIgnoreCase(..)
方法进行更精细的细化。