0

我有一张我已经填充的地图(比如说它是一个 HashMap)。我希望它缩小到大小...我不在乎我删除了哪些元素,我只想删除 k 个元素。

最有效的方法是什么(迭代除外)?

编辑: k 事先不知道。基于其他类型地图的建议是相关的。

4

4 回答 4

2

如果它是 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());  
        }     
    } 
于 2012-08-16T06:01:47.917 回答
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 回答
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 回答
0

通用哈希图只有有限数量的接口函数。如果 K 很小,我看不出有什么比迭代更好的方法,一旦 K 键被删除就退出迭代。当然,如果 K 很大,做其他事情可能会更好,例如保留大小为 k 的元素并清除。如果您需要特定的特征,您自己的 hashmap 可以具有您需要的任何特征。

于 2012-08-16T06:09:27.250 回答