我想从一个集合中删除长度为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
你能帮忙吗?
答案 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++;
}