Я создал класс Foo
, который имеет метод toArray()
, который возвращает Array<Int>
.
Теперь у меня есть HashMap, отображающий Strings в HashMaps, который отображает Object в Foo.То есть:
HashMap<String,HashMap<Object,Foo>>
И я хочу создать новый объект типа:
HashMap<String,HashMap<Object,Array<Int>>>
, который получается путем вызова функции toArray () для каждого элемента Foo в исходном HashMAp.
Для этого я обычно делал бы что-то вроде:
public static HashMap<String,HashMap<Object,Array<Int>>> changeMap(Map mpOld) {
Object key2;
String key1;
Iterator it2;
HashMap<String,HashMap<Object,Array<Int>>> mpNew=
new HashMap<String,HashMap<Object,Array<Int>>>()
Iterator it1 = mpOld.keySet().iterator();
while (it1.hasNext()) {
key1=it1.next();
it2= mpOld.get(key1).keySet().iterator();
mpNew.put(key1,new HashMap<Object,Array<Int>>())
while (it2.hasNext()) {
key2=it2.next();
mpNew.get(key1).put(key2,mpOld.get(key1).get(key2).toArray());
//TODO clear entry mpOld.get(key1).get(key2)
}
//TODO clear entry mpOld.get(key1)
}
return mpNew;
}
Подобный код работает просто отлично, но размер HashMap слишком велик, чтобы держать два из них в памяти.Как видите, я добавил две точки, в которых я хочу очистить некоторые записи.Проблема в том, что если я это сделаю, я получу либо ошибку параллелизма, либо цикл итератора просто завершится.
Интересно, есть ли лучший способ перебрать карты и скопировать информацию.
Кроме того, я работаю в проекте Scala, но здесь я должен использовать типы Java для некоторых проблем совместимости.Хотя Java.util.HashMap
не является итератором, может быть, в Scala есть какая-то скрытая функция, чтобы справиться с этим?
Спасибо,