如何通过LinkedList迭代并从Java中删除它中的某些单词

时间:2016-12-29 12:05:35

标签: java collections linked-list

尝试从LinkedList中删除一些单词。这是我用于测试的数据:
String[] stopwords = {"the","and"};
nwl = LinkedList<String>(Arrays.asList(input));
String input = "the and of the "
我希望获得的结果是:[of]但我得到的是:[the, end, of, the]

for (Iterator<String> iter = nwl.iterator(); iter.hasNext();) {
  String word = iter.next();
    for (int i = 0; i < nwl.size(); i++){
      if(word == stopwords[i]) {
        iter.remove();
      }
    }
}

1 个答案:

答案 0 :(得分:1)

比较字符串时,您需要使用.equals()方法,而不是==运算符。因此,您需要将if (word == stopwords[i])更改为if(word.equals(stopwords[i]))

更长的版本:

粗略地说,==运算符确定两个变量是否指向同一个对象(在我们的例子中:wordstopwords[i]是否指向同一个字符串对象)。 .equals()方法确定两个对象是否相同(内容明确)。如果您的情况,程序无法生成所需的输出,因为您有两个不同的字符串保持相同的内容。因此,通过==比较它们会产生false,而通过.equals()进行比较会产生“真”。

修改

阅读链接中发布的程序后,我发现了以下几点:首先,内部for循环的条件必须更改为i < stopwords.length。其次,newWordList对象未正确初始化。它是新的LinkedList<String>(Arrays.asList(parts)),这意味着LinkedList将包含一个值为the and of the的String元素,这不是您想要的。您希望LinkedList包含四个字符串元素,如下所示:

  • 元素0:the
  • 元素1:and
  • 元素2:of
  • 元素3:the

因此初始化需要更改为new LinkedList<String>( Arrays.asList(parts.split(" ")))。具体来说,parts.split(" ")将给定字符串(split)分解为单独的单词,返回这些单词的数组。

public static void main (String[] args) throws java.lang.Exception
{
    String[] stopwords = { "the", "and" };
    String parts = "the and of the";
    LinkedList<String> newWordList = new LinkedList<String>(
      Arrays.asList(parts.split(" ")));

    for (Iterator<String> iter = newWordList.iterator(); iter.hasNext();) {
        String word = iter.next();
        for (int i = 0; i < stopwords.length; i++) {
            if (word.equals(stopwords[i])) {
                iter.remove();
            }
        }
    }
    System.out.println(newWordList.toString());
}