0

入力したマップがあります(HashMapだと言います)。サイズを小さくしたい...どの要素を削除してもかまいません。k個の要素を削除したいだけです。

これを行うための最も効率的な方法は何ですか(反復する以外)?

編集: kは事前にわかっていません。他の種類のマップに基づく提案が関連しています。

4

4 に答える 4

2

なぜ反復しないのですか?非常に効率的である可能性が高いイテレータから削除できます-追加のルックアップは必要ありません:

Iterator<Map.Enty<Foo, Bar>> it = map.entrySet().iterator();
for (int i = 0; i < k && it.hasNext; i++)
{
    it.next();
    it.remove();
}
于 2012-08-16T06:07:22.120 に答える
2

そのハッシュマップの場合、反復よりも良いオプションはないと思いますが、ツリーマップを使用できる場合はこれを使用してください...

map.headMap(key).clear();

例えば:

 public class Test     
    {     
        public static void main( String[] args )     
        {     
            SortedMap<Integer,String> map = new TreeMap<Integer,String>();     
            map.put( 1, "HI" );     
            map.put( 2, "BYE" );     
            map.put( 4, "GUY" );     
            map.put( 7, "SKY" );     
            map.put( 9, "HELLO" );     

            System.out.println(map.keySet());  

            map.headMap(5).clear(); // 5 is exclusive  

            System.out.println(map.keySet());  
        }     
    } 
于 2012-08-16T06:01:47.917 に答える
0

汎用ハッシュマップには限られた数のインターフェース関数しかありません。K が小さい場合、K 個のキーが削除されたら、反復して反復から抜け出すよりも明らかな良い方法はありません。もちろん、K が大きい場合は、サイズ k の要素を保持してクリアするなど、別のことを行う方がよい場合があります。特定の特性が必要な場合は、独自のハッシュマップに必要な特性を含めることができます。

于 2012-08-16T06:09:27.250 に答える
0

反復が唯一の方法です。

// this is the number of items you want to remove
final int NUMBER_TO_REMOVE = 2;

// this is your map
Map<String, String> map = new HashMap<String, String>();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
map.put("e", "5");
map.put("f", "6");
map.put("g", "7");
map.put("h", "8");
map.put("i", "9");

// get the keys
String[] keys = map.keySet().toArray(new String[map.size()]);

// remove the correct number from the map
for(int i = 0; i < NUMBER_TO_REMOVE; i++) {
    map.remove(keys[i]);
}

// your map is now NUMBER_TO_REMOVE elements smaller
于 2012-08-16T06:06:43.347 に答える