入力したマップがあります(HashMapだと言います)。サイズを小さくしたい...どの要素を削除してもかまいません。k個の要素を削除したいだけです。
これを行うための最も効率的な方法は何ですか(反復する以外)?
編集: kは事前にわかっていません。他の種類のマップに基づく提案が関連しています。
入力したマップがあります(HashMapだと言います)。サイズを小さくしたい...どの要素を削除してもかまいません。k個の要素を削除したいだけです。
これを行うための最も効率的な方法は何ですか(反復する以外)?
編集: kは事前にわかっていません。他の種類のマップに基づく提案が関連しています。
なぜ反復しないのですか?非常に効率的である可能性が高いイテレータから削除できます-追加のルックアップは必要ありません:
Iterator<Map.Enty<Foo, Bar>> it = map.entrySet().iterator();
for (int i = 0; i < k && it.hasNext; i++)
{
it.next();
it.remove();
}
そのハッシュマップの場合、反復よりも良いオプションはないと思いますが、ツリーマップを使用できる場合はこれを使用してください...
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());
}
}
汎用ハッシュマップには限られた数のインターフェース関数しかありません。K が小さい場合、K 個のキーが削除されたら、反復して反復から抜け出すよりも明らかな良い方法はありません。もちろん、K が大きい場合は、サイズ k の要素を保持してクリアするなど、別のことを行う方がよい場合があります。特定の特性が必要な場合は、独自のハッシュマップに必要な特性を含めることができます。
反復が唯一の方法です。
// 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