Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何删除HashMap中键值大于定义值的所有项_Java_Android_Time Complexity - Fatal编程技术网

Java 如何删除HashMap中键值大于定义值的所有项

Java 如何删除HashMap中键值大于定义值的所有项,java,android,time-complexity,Java,Android,Time Complexity,在我的Android项目中,我有一种方法可以部分地使缓存失效 (HashMap) 我目前正在使用HashMap与第三方代码兼容 我找到了一个很好的答案,但需要切换到树形图。给出的解决方案是: treeMap.tailMap(key).clear(); TreeMap解决方案比我在HashMap上的努力要好得多: //where hashMap is a copied instance for the method for (Integer key : hashMap.keySet()) {

在我的Android项目中,我有一种方法可以部分地使缓存失效 (
HashMap

我目前正在使用HashMap与第三方代码兼容

我找到了一个很好的答案,但需要切换到树形图。给出的解决方案是:

treeMap.tailMap(key).clear();
TreeMap解决方案比我在HashMap上的努力要好得多:

//where hashMap is a copied instance for the method
for (Integer key : hashMap.keySet()) {
    if (key > minPosition) {
        hashMap.remove(key);
    }
}

在HashMap中执行此操作是否有更好的时间/复杂性解决方案,类似于TreeMap解决方案?

如果需要使用
HashMap
,没有比迭代条目集并一次删除一个条目更好(更有效)的解决方案了。这将是一个O(N)操作。您需要访问/测试地图中的所有条目

正如您正确观察到的,您可以更整洁、更有效地从
树映射中批量删除条目。这将是一个
O(logN)
操作。但缺点是插入和删除是
O(logN)
而不是
O(1)


在某些用例中,
LinkedHashMap
会有所帮助,但在这个用例中则不然。(它根据插入顺序而不是键的值对条目进行排序。)

在您自己的实现中提供的任何东西都比不上TreeMap解决方案。您只需实现一个二进制搜索来定位要删除的成员的开始位置,然后将开始节点设置为下一个节点,据我所知,这一切都是在后台使用TreeMap完成的。这是一个更安全的赌注,所以我就这么做了。嗨,我不希望它比TreeMap解决方案更好。我想要比我的解决方案更好的东西。更接近树状图的效率。到目前为止,TreeMap对我来说似乎也更好,但如果有机会我可以用HashMap做得很好,我不想承诺(在所有地方转换为HashMap节省了很多精力,这个愚蠢的第三方东西不只是停留在映射界面上,你可以在
HashMap.keySet()上迭代)
所以你没有加载完整的
条目
是的,这是有道理的,事实上,我会在我的问题中更改它。但不是通用映射的完整解决方案?我不认为有一个-映射没有关于任何排序的承诺,因此没有可以使用的技巧。哈希映射也没有(事实上,一个好的散列算法不可能比O(n)更好)。通过微优化,您可能可以获得速度的微小提高,但不会阻止它在整个映射中成为O(n)。如果您需要这样做,您需要一个针对它进行优化的数据结构,而一般映射不会。