【发布时间】:2021-12-16 04:56:37
【问题描述】:
我有一个初始化为的地图
val cache: SortedMap<String, String> = sortedMapOf()
地图用作缓存,可以包含具有自己唯一键的重复值。我想检查并计算缓存中有多少重复值。请注意,缓存可以包含数百万个条目。
到目前为止,我以这种方式检查重复项
val uniqueValueSet = hashSetOf<String>()
val numDuplicates = cache.filter {!uniqueValueSet.add(it.value)}.count()
但是,我觉得这种检查内存效率低下,将所有不同的值添加到一个集合中会创建一个过时的集合,其中可能包含数百万个元素。
有没有更好、更优化的方法来检查地图中值之间的重复项?
【问题讨论】:
-
我认为没有 Set 或等效的 Set 没有任何合乎逻辑的方法可以做到这一点,除非您对每个项目进行迭代检查,导致 O(n^2 ) 。您至少可以像这样在更简单的单行中执行此操作,但它当然仍然使用一组:
val numDuplicates = cache.size - cache.values.toSet().size至少它不会创建所有具有重复值的条目的额外列表。 -
只是想评论一下你计算它们的方式,还有@Tenfour04 的方式非常聪明:)
-
请注意,您的
uniqueValueSet包含对您的值的引用 - 它不会复制值本身。所以它可能不像你担心的那样需要内存。 (特别是如果您通过调用适当的HashSet()构造函数来预先调整它的大小。)
标签: dictionary kotlin duplicates