如何在Java中拆分HashMap
我想知道是否可以将HashMap拆分成更小的子地图。
在我的例子中,我有一个100个元素的HashMap,我想从原始的HashMap创建2个(或更多)小HashMaps,第一个包含从0到49的条目,第二个包含从50到99的条目。
Map bigMap = new HashMap (); //should contains entries from 0 to 49 of 'bigMap' Map smallMap1 = new HashMap (); //should contains entries from 50 to 99 of 'bigMap' Map smallMap2 = new HashMap ();
有什么建议么? 非常感谢!
你必须使用HashMap
吗?
TreeMap
非常适合这类事情。 这是一个例子。
TreeMap sorted = new TreeMap(bigMap); SortedMap zeroToFortyNine = sorted.subMap(0, 50); SortedMap fiftyToNinetyNine = sorted.subMap(50, 100);
您基本上需要迭代bigMap
的条目,并决定是否应将它们添加到smallMap1
或smallMap2
。
由于HashMap
是无序的(条目可能以任何顺序出现),因此将其精确分割是没有意义的。 我们可以简单地使用交替布尔标志。
boolean b = false; for (Map.Entry e: bigMap.entrySet()) { if (b) smallMap1.put(e.getKey(), e.getValue()); else smallMap2.put(e.getKey(), e.getValue()); b = !b; }
使用for (Entry
,并递增i
以检查是否必须在第一个小地图或第二个小地图中添加该条目。
这是一个SortedMap的解决方案:
public static List> splitMap(final SortedMap map, final int size) { List keys = new ArrayList<>(map.keySet()); List> parts = new ArrayList<>(); final int listSize = map.size(); for (int i = 0; i < listSize; i += size) { if (i + size < listSize) { parts.add(map.subMap(keys.get(i), keys.get(i + size))); } else { parts.add(map.tailMap(keys.get(i))); } } return parts; }
for (Map.Entry entry : bigMap.entrySet()) { // ... }
是迭代原始地图的最快方法。 然后,您可以使用Map.Entry键来确定要填充的新映射。
这是我工作的function之一,我希望它对其他人有帮助。 无论作为键存储的Object / primitive,这个都可以工作。
上面提到的TreeMap方法只有在键是基元,有序和索引的精确序列时才有效。
public List