如何从一组中删除长度为5的字符串?

时间:2011-12-01 04:47:33

标签: java string set

我想从一个集合中删除长度为5的字符串,但它会不断输出集合本身。

public void remove5()
{
Set<String> newSet = new HashSet<String>();
newSet.add("hello");
newSet.add("my");
newSet.add("name");
newSet.add("is");
newSet.add("nonsense");
for(String word: newSet)
{
    if(word.length()==5)
    {
        newSet.remove(word); // Doesn't Help - throws an error Exception in thread "main" java.util.ConcurrentModificationException
    }
}
    System.out.println(newSet);
}

我希望输出为:

my
name
is
nonsense

(你好,因为它是5个字符而删除了)

但我每次都会得到这个:

hello
my
name
is 
nonsense

你能帮忙吗?

7 个答案:

答案 0 :(得分:2)

Iterator<String> it= newStr.iterator();
while(it.hasNext()) { // iterate
   String word = it.next();
   if(word.length() == 5) { // predicate
      it.remove();  // remove from set through iterator - action
   }
}

答案 1 :(得分:2)

正如其他人所建议你无法改变字符串原因,代码片段:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class TestString {
public void remove5() {
    Set<String> newSet = new HashSet<String>();
    newSet.add("hello");
    newSet.add("my");
    newSet.add("name");
    newSet.add("is");
    newSet.add("nonsense");
    for (Iterator<String> iter = newSet.iterator(); iter.hasNext();) {
        if (iter.next().length() == 5) {
            iter.remove();
        }
    }
    System.out.println(newSet);
}

public static void main(String[] args) {
    new TestString().remove5();
}
}

如果迭代集合并在循环中移除对象,它会抛出ConcurrentModificationException,因为HastSet迭代器是一个失败的快速迭代器。

答案 2 :(得分:2)

要实际修改你的设置,你需要做这样的事情:

Iterator<String> iter = newSet.iterator();
while (iter.hasNext())
    if (iter.next().length() == 5)
        iter.remove();

由于字符串是不可变的,因此您无法修改已添加到集合中的字符串,无论如何,即使您可以就地修改它们,用“”替换它们也不会将它们从集合中删除。< / p>

答案 3 :(得分:0)

字符串为immutable,对字符串word或任何其他字符串所做的更改不会反映在Set

字符串中

添加

if(word.length()==5)
    {
        word.replaceAll(word, "");
        newSet.remove(word);
    }

你可以参考HashSet的这个功能

remove(Object o) 

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashSet.html

答案 4 :(得分:0)

字符串在Java中是不可变的,这意味着当您调用word.replaceAll(word,"")时,它将返回字符串“”(您没有分配给任何东西)。 不会更改,而Set仍指向的旧值。您需要从设置中删除

答案 5 :(得分:0)

如果找到长度为5的字符串,则需要将其从集合中删除:

newSet.remove(word);

实际上,您似乎正在尝试将单词更改为空字符串,但字符串是不可变的。你的电话实际上做的是返回一个空字符串。

答案 6 :(得分:0)

int i = 0;
Set<String> newSet = new HashSet<String>();
newSet.add("hello");
newSet.add("my");
newSet.add("name");
newSet.add("is");
newSet.add("nonsense");
for(String word: newSet)
{
   if(word.length()==5)
   {
       newSet.remove(i);
   }
   i++;
}