如何在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的条目,并决定是否应将它们添加到smallMap1smallMap2

由于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 entry : bigMap.entrySet()) ,并递增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> splitMap(Map enrichmentFieldsMap, int splitSize) { float mapSize = enrichmentFieldsMap.size(); float splitFactorF = splitSize; float actualNoOfBatches = (mapSize / splitFactorF); double noOfBatches = Math.ceil(actualNoOfBatches); List> listOfMaps = new ArrayList<>(); List> listOfListOfKeys = new ArrayList<>(); int startIndex = 0; int endIndex = splitSize; Set keys = enrichmentFieldsMap.keySet(); List keysAsList = new ArrayList<>(); keysAsList.addAll(keys); /* * Split the keys as a list of keys, * For each key sub list add to a Primary List - listOfListOfKeys */ for (int i = 0; i < noOfBatches; i++) { listOfListOfKeys.add(keysAsList.subList(startIndex, endIndex)); startIndex = endIndex; endIndex = (int) (((endIndex + splitSize) > mapSize) ? mapSize : (endIndex + splitSize)); } /** * For Each list of keys, prepare a map * **/ for(List keyList: listOfListOfKeys){ Map subMap = new HashMap<>(); for(Integer key: keyList){ subMap.put(key,enrichmentFieldsMap.get(key)); } listOfMaps.add(subMap); } return listOfMaps; }