在scala中删除迭代器

时间:2018-02-19 20:22:41

标签: java scala

如何将此转换为scala,因为迭代器没有删除方法?
iter定义如下:

Iterator<Integer> iter = cache.keySet().iterator();

其中cache是​​一个hashmap

while (iter.hasNext()) {
        int num = iter.next();
        if (!part.contains(num)){
            iter.remove();
    }
}

3 个答案:

答案 0 :(得分:2)

如果您的实际目标是从缓存中过滤某些键,则可以直接执行此操作,而无需循环和迭代器:

val cache = Map("a" -> 3, "b" -> 5, "c" -> 7)
val part = Set("x", "y", "b")
val filteredCache = cache.filter{ case (k, _) => part.contains(k) }
// prints `Map(b -> 5)`, because "a" and "c" not in `part`
println(filteredCache) 

修改

正如@ SymY4绝对正确指出的那样,filterfilterKeys的行为完全不同:filter返回一个新的Map(不可变版本),或者就地过滤元素(可变版本) )。但是,filterKeys仅构建原始集合的筛选视图。因此,不建议重复调用filterKeys,因为它会将越来越多的视图叠加在一起。

但是,filter的解决方案仍然有效。

答案 1 :(得分:1)

在地图上执行大量过滤会最终导致生成的地图太慢。因为在到达实际的缓存存储之前,您需要应用已添加的所有过滤器。我建议使用--语法

从地图中删除元素
scala> Map("a" -> 1, "b" -> 2, "c" -> 3)
res0: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2, c -> 3)

scala> res0 -- Set("x", "y", "b")
res1: scala.collection.immutable.Map[String,Int] = Map(a -> 1, c -> 3)

答案 2 :(得分:0)

也许是这样

val it = Iterator.continually(hashMap.headOption).takeWhile(_.isDefined).flatten
for ((key, value) <- it) {
    hashMap.remove(key)
    ... //do something here with value
}

其中hashMap是可变的HashMap实例。