如何在foreach迭代期间更改Set <string>中的字符串?</string>

时间:2011-05-20 10:07:21

标签: java

我有一组字符串,我想迭代,并改变所有相等的东西,等于别的东西:

// Set<String> strings = new HashSet()
for (String str : strings) {
  if (str.equals("foo")) {
    // how do I change str to equal "bar"?
  }
}

我尝试过无效的replace()。我也尝试删除“str”并添加所需的字符串,这会导致错误。我该怎么做呢?

6 个答案:

答案 0 :(得分:6)

两点:

  1. 字符串是不可变的;你不能“改变”一个字符串。您可以从Set中删除一个并将其替换为另一个,但这就是所有变化。
  2. Set表示“每个只有一个副本”。什么是“改变所有”的东西?你为什么要迭代Set?为什么不这样做呢?

    strings.remove( “foo” 的);
    strings.add( “条”);

答案 1 :(得分:2)

由于Set不能有重复,你要做的事情有点奇怪。为什么要迭代?

if (strings.contains("foo")) {
  strings.remove("foo");
  strings.add("bar");
}

如果线程之间共享strings集,请确保整个块正确同步。

答案 2 :(得分:1)

迭代时不应更改集。

最好试试这个:

Set<String> strings = new HashSet();
strings.add("foo");
strings.add("baz");

Set<String> stringsNew = new HashSet();

for (String str : strings) {
    if (str.equals("foo")) {
    stringsNew.add("bar");
    } else {
    stringsNew.add(str);
    }
}

System.out.println(stringsNew);

答案 3 :(得分:0)

如果在迭代过程中更改HashSet,则会得到ConcurrentModificationException。这意味着,您必须首先删除“foo”,然后添加“bar” - 在迭代器之外

答案 4 :(得分:0)

集合是一个不包含重复对象的集合。因此,如果您希望用其他内容“替换”集合中的对象,您可以先将其删除,然后添加您希望“替换”它的字符串。

答案 5 :(得分:0)

// Set<String> s = new HashSet();

     for (String str : s) {
                if (str.equals("foo")) {
                    s.remove(str);
                    s.add("bar");
                }
            }