本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题:Java里面怎么边迭代边修改Set?
假设我有一个整数集合,我想增加集合中的每一个整数。我该怎么做呢?
我是否允许向集合添加和删除元素,在迭代它的时候?
当我迭代原始集合时,我是否需要创建一个新的集合来存储“复制和修改”的元素?
编辑:如果集合中的元素是不可变的呢?
回答以
你可以在迭代期间使用Iterator对象安全地从集合中删除;在迭代时试图通过它的API修改一个集合会破坏迭代器。Set类通过getIterator()提供了一个迭代器。
然而,Integer对象是不可变的;我的策略是遍历集合,对于每个整数 i,添加i+1到新的临时集合。完成迭代后,从原始集合中删除所有元素,并添加新临时集合里面的所有元素进去。
Set<Integer> s; //contains your Integers
...
Set<Integer> temp = new Set<Integer>();
for(Integer i : s)
temp.add(i+1);
s.clear();
s.addAll(temp);
回答二
你可以创建原始的int类型的可变包装器,并创建它们的一个集合
class MutableInteger
{
private int value;
public int getValue()
{
return value;
}
public void setValue(int value)
{
this.value = value;
}
}
class Test
{
public static void main(String[] args)
{
Set<MutableInteger> mySet = new HashSet<MutableInteger>();
// populate the set
// ....
for (MutableInteger integer: mySet)
{
integer.setValue(integer.getValue() + 1);
}
}
}
当然,如果你正在使用HashSet,你应该在MutableInteger中实现hash, equals方法,但这超出了这个答案的范围。
回答三
我不太喜欢迭代器的用法,请你考虑一下这个选择。它也更安全,因为你产生的内部状态更少
private Map<String, String> JSONtoMAP(String jsonString) {
JSONObject json = new JSONObject(jsonString);
Map<String, String> outMap = new HashMap<String, String>();
for (String curKey : (Set<String>) json.keySet()) {
outMap.put(curKey, json.getString(curKey));
}
return outMap;
}
文章翻译自Stack Overflow:stackoverflow.com/questions/7…