9

HashMapをより小さなサブマップに分割することは可能かどうか疑問に思いました。

私の場合、100個の要素のHashMapがあり、元のHashMapから2つ(またはそれ以上)の小さいHashMapを作成したいと思います。最初のHashMapには0から49のエントリが含まれ、2番目のHashMapには50から99のエントリが含まれます。

Map <Integer, Integer> bigMap = new HashMap <Integer, Integer>();

//should contains entries from 0 to 49 of 'bigMap'
Map <Integer, Integer> smallMap1 = new HashMap <Integer, Integer>(); 


//should contains entries from 50 to 99 of 'bigMap'
Map <Integer, Integer> smallMap2 = new HashMap <Integer, Integer>();

助言がありますか?どうもありがとう!

4

11 に答える 11

17

使用する必要がありますHashMapか?

TreeMapこの種のものには本当に良いです。以下に例を示します (0、50、および 99 はインデックスではなくマップ キーであることに注意してください)。

TreeMap<Integer, Integer> sorted = new TreeMap<Integer, Integer>(bigMap);

SortedMap<Integer, Integer> zeroToFortyNine = sorted.subMap(0, 50); // toKey inclusive, fromKey exclusive
SortedMap<Integer, Integer> fiftyToNinetyNine = sorted.subMap(50, true, 99, true);
于 2013-01-31T15:45:26.713 に答える
3

は順序付けされて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;
}
于 2013-01-31T15:44:52.253 に答える
1

SortedMap を使用したソリューションを次に示します。

public static <K, V> List<SortedMap<K, V>> splitMap(final SortedMap<K, V> map, final int size) {
    List<K> keys = new ArrayList<>(map.keySet());
    List<SortedMap<K, V>> 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;
}
于 2016-06-03T12:54:49.673 に答える
1

を反復処理しbigMapfor (Entry<Integer, Integer> entry : bigMap.entrySet())をインクリメントしiて、最初の小さなマップまたは 2 番目のマップにエントリを追加する必要があるかどうかを確認します。

于 2013-01-31T15:45:21.193 に答える
1

マップを分割する 2 つの簡単な方法を次に示します。

  1. パーティションのサイズまたは

  2. パーティション数

     /**
      *
      * @param bulkyMap - your source map to be partitioned
      * @param batchSize - partition size
      * @return
      */
     public List<Map<String, Object>> getMiniMapsInFixedSizeBatches(Map<String, Object> bulkyMap, int batchSize) {
         if (batchSize >= bulkyMap.size() || batchSize <= 0) {
             return Arrays.asList(bulkyMap);
         }
         List<Map<String, Object>> batches = new ArrayList<>();
         int innerBatchcount = 1;
         int count = 1;
         Map<String, Object> tempMap = new HashMap<>();
         for (Map.Entry<String, Object> entry : bulkyMap.entrySet()) {
             tempMap.put(entry.getKey(), entry.getValue());
             innerBatchcount++;
             count++;
             if (innerBatchcount > batchSize || count > bulkyMap.size()) {
                 innerBatchcount = 1;
                 Map<String, Object> batchedMap = new HashMap<>();
                 batchedMap.putAll(tempMap);
                 batches.add(batchedMap);
                 tempMap.clear();
             }
         }
         return batches;
     }
    
     /**
      * the number of partitions is not always guaranteed as the algorithm tries to optimize the number of partitions
      * @param bulkyMap - your source map to be partitioned
      * @param numPartitions  - number of partitions (not guaranteed)
      * @return
      */
     public List<Map<String, Object>> getMiniPartitionedMaps(Map<String, Object> bulkyMap, int numPartitions) {
         int size = bulkyMap.size();
         int batchSize = Double.valueOf(Math.ceil(size * 1.0 / numPartitions)).intValue();
         return getMiniMapsInFixedSizeBatches(bulkyMap, batchSize);
     }
    
于 2020-03-04T14:03:40.470 に答える
0
for (Map.Entry<Integer,Integer> entry : bigMap.entrySet()) {
   // ...
}

元のマップを反復処理する最速の方法です。次に、 Map.Entryキーを使用して、どの新しいマップに入力するかを決定します。

于 2013-01-31T15:44:09.377 に答える