我有一张我已经填充的地图(比如说它是一个 HashMap)。我希望它缩小到大小...我不在乎我删除了哪些元素,我只想删除 k 个元素。
最有效的方法是什么(迭代除外)?
编辑: k 事先不知道。基于其他类型地图的建议是相关的。
我有一张我已经填充的地图(比如说它是一个 HashMap)。我希望它缩小到大小...我不在乎我删除了哪些元素,我只想删除 k 个元素。
最有效的方法是什么(迭代除外)?
编辑: k 事先不知道。基于其他类型地图的建议是相关的。
如果它是 HashMap,我认为没有比迭代更好的选择,但如果你可以使用 TreeMap,请使用它......
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());
}
}
为什么不迭代?您可以从可能非常有效的迭代器中删除 - 不需要额外的查找:
Iterator<Map.Enty<Foo, Bar>> it = map.entrySet().iterator();
for (int i = 0; i < k && it.hasNext; i++)
{
it.next();
it.remove();
}
迭代是唯一的方法。
// 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
通用哈希图只有有限数量的接口函数。如果 K 很小,我看不出有什么比迭代更好的方法,一旦 K 键被删除就退出迭代。当然,如果 K 很大,做其他事情可能会更好,例如保留大小为 k 的元素并清除。如果您需要特定的特征,您自己的 hashmap 可以具有您需要的任何特征。