Java 您能否在不迭代的情况下有效地从映射中删除任何k元素?

Java 您能否在不迭代的情况下有效地从映射中删除任何k元素?,java,map,performance,Java,Map,Performance,我有一个已填充的映射(假设它是HashMap)。我想把它裁小一点。。。我不在乎删除哪些元素,我只想删除k个元素 做这件事最有效的方法是什么(除了迭代) 编辑:k事先不知道。基于其他类型映射的建议是相关的。如果它是HashMap,我认为没有比迭代更好的选择,但是如果您可以使用TreeMap,请使用此 map.headMap(key.clear() 例如: public class Test { public static void main( Stri

我有一个已填充的映射(假设它是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());  
        }     
    } 
公共类测试
{     
公共静态void main(字符串[]args)
{     
SortedMap map=新树映射();
地图放置(1,“HI”);
地图放置(2,“再见”);
地图放置(4,“GUY”);
地图放置(7,“天空”);
放(9,“你好”);
System.out.println(map.keySet());
map.headMap(5.clear();//5是独占的
System.out.println(map.keySet());
}     
} 

如果它是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());  
        }     
    } 
公共类测试
{     
公共静态void main(字符串[]args)
{     
SortedMap map=新树映射();
地图放置(1,“HI”);
地图放置(2,“再见”);
地图放置(4,“GUY”);
地图放置(7,“天空”);
放(9,“你好”);
System.out.println(map.keySet());
map.headMap(5.clear();//5是独占的
System.out.println(map.keySet());
}     
} 

迭代是唯一的方法

// 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
//这是要删除的项目数
最终整数_至_移除=2;
//这是你的地图
Map Map=newhashmap();
地图放置(“a”、“1”);
地图放置(“b”、“2”);
地图放置(“c”、“3”);
地图放置(“d”、“4”);
地图.put(e,5);;
地图放置(“f”、“6”);
地图放置(“g”、“7”);
地图放置(“h”、“8”);
地图.put(“i”、“9”);
//拿到钥匙
String[]keys=map.keySet().toArray(新字符串[map.size()]);
//从地图上删除正确的数字
for(int i=0;i
迭代是唯一的方法

// 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
//这是要删除的项目数
最终整数_至_移除=2;
//这是你的地图
Map Map=newhashmap();
地图放置(“a”、“1”);
地图放置(“b”、“2”);
地图放置(“c”、“3”);
地图放置(“d”、“4”);
地图.put(e,5);;
地图放置(“f”、“6”);
地图放置(“g”、“7”);
地图放置(“h”、“8”);
地图.put(“i”、“9”);
//拿到钥匙
String[]keys=map.keySet().toArray(新字符串[map.size()]);
//从地图上删除正确的数字
for(int i=0;i
为什么不迭代?您可以从迭代器中删除,这可能非常有效-无需额外查找:

Iterator<Map.Enty<Foo, Bar>> it = map.entrySet().iterator();
for (int i = 0; i < k && it.hasNext; i++)
{
    it.next();
    it.remove();
}
Iterator it=map.entrySet().Iterator();
for(int i=0;i
为什么不迭代?您可以从迭代器中删除,这可能非常有效-无需额外查找:

Iterator<Map.Enty<Foo, Bar>> it = map.entrySet().iterator();
for (int i = 0; i < k && it.hasNext; i++)
{
    it.next();
    it.remove();
}
Iterator it=map.entrySet().Iterator();
for(int i=0;i
通用hashmap只有有限数量的接口函数。若K很小,我看不到任何明显比迭代更好的方法,一旦K个键被移除,就停止迭代。当然,如果K较大,则最好执行其他操作,例如保留size-K元素和clear。如果您需要特定的特性,您自己的hashmap可以具有您需要的任何特性。

通用hashmap只有有限数量的接口函数。若K很小,我看不到任何明显比迭代更好的方法,一旦K个键被移除,就停止迭代。当然,如果K较大,则最好执行其他操作,例如保留size-K元素和clear。如果您需要特定的特性,您自己的hashmap可以具有您需要的任何特性。

我认为如果不在
hashmap
中进行迭代,这是不可能的。从
hashmap
提供的公共API来看,我认为没有比迭代
k
次更好的方法了。如果这是您自己的链式哈希表,您可以切断一些条目链。我认为如果不在
HashMap
中迭代,这是不可能的。从
HashMap
提供的公共API来看,我认为没有比迭代
k
次更好的方法了。如果这是您自己的链式哈希表,您可以切断一些条目链。这意味着我需要一个数字键或跟踪插入顺序。。。不是吗?据我所知,这并不比我的建议更有效-
clear()
将遍历视图的条目集,调用
remove()
。这只是做同样事情的一种更加间接的方式。这意味着我要么需要一个数字键,要么跟踪插入顺序。。。不是吗?据我所知,这并不比我的建议更有效-
clear()
将遍历视图的条目集,调用
remove()
。这只是做同样事情的一种更加间接的方式。为什么不迭代呢?因为那充其量是ω(k)时间,而且我不在乎去掉哪些元素,我也许能做得更好。@eyalroz:我不这么认为。可以这样想:映射下面的数组包含对所有内容的引用。你需要清除
k
个引用,那么怎么可能少于O(k)个时间呢?我唯一能看到你做得更好的情况