Java里面怎么边迭代边修改Set?| Java Debug 笔记

292 阅读2分钟

本文正在参加「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…