Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 scala中的迭代器删除_Java_Scala - Fatal编程技术网

Java scala中的迭代器删除

Java scala中的迭代器删除,java,scala,Java,Scala,由于迭代器没有删除方法,如何将其转换为scala? iter的定义如下: Iterator<Integer> iter = cache.keySet().iterator(); 如果您的实际目标是从缓存中筛选一些键,则可以直接执行此操作,无需循环和迭代器: val cache = Map("a" -> 3, "b" -> 5, "c" -> 7) val part = Set("x", "y", "b") val filteredCache = cache.fil

由于迭代器没有删除方法,如何将其转换为scala?
iter的定义如下:

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

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

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绝对正确地指出的,
filter
filterKeys
的行为完全不同:
filter
返回一个新映射(不可变版本),或者在适当的位置过滤元素(可变版本)。但是,
filterKeys
仅构建原始集合的筛选视图。因此,反复调用
filterKeys
是不可取的,因为这样会将越来越多的视图堆叠在彼此的顶部


但是,使用
过滤器的解决方案应该仍然有效。

在地图上执行大量过滤器最终会使生成的地图速度过慢。因为在到达实际缓存存储区之前,需要应用所有已添加的筛选器。我建议使用
--
语法从映射中删除元素

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)
也许是这样:

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

对于((键,值)
iter
是如何定义的?您需要迭代器做什么,为什么不直接使用
cache.filter{case(k,)=>part.contains(k)}过滤
cache
?是的,我想这很好,谢谢。这将删除不包含num的元组,对吗?@SuzyTros这将删除所有键不包含在
部分中的元组。如果我没有遗漏任何内容,这就是迭代器循环所做的。请参阅下面的可编译示例。对映射执行大量筛选最终将使生成的映射太慢。我认为最好通过执行以下操作完全删除键:
val updatedCache=cache--Set(“x”、“y”、“b”)
@SimY4确实,您对
过滤器键的看法是正确的,它不会创建新的集合,而是返回旧集合的视图。这是一个令人讨厌的小陷阱…非常感谢您指出它!您是如何得出这个结论的?文档非常清楚地说
过滤器
“返回一个新的可遍历集合,该集合由满足给定谓词p的该可遍历集合的所有元素组成。元素的顺序将保留。”(emphasis mine)@Andreytukin您研究过实现了吗?您会看到,
过滤器
是围绕原始集合的包装。这有助于节省一点内存,因为您不必复制整个地图,但最终您的地图会变得非常慢。您自己试试。@Andreytukin我错了,对不起。
过滤器
正在像y一样工作但是,
filterKeys
将所有东西都包装在一个过滤器包装器中,所以
filterKeys
最终会很慢,而不是
Filter
至少在2.12.4中关于
Filter
的说法是不可复制的。如果我定义
val m=((0到100)zip(400到5000)).toMap;val n=m.Filter{case(k,)=>k%2==0}
然后显示
m.getClass
n.getClass
,我得到
scala.collection.immutable.HashMap$HashTrieMap
。如果您的scala做了其他事情,您应该升级到新版本或提交错误报告。我正在查看
filterKeys
,我不经常使用它,也许我确实错过了一些兴。
val it = Iterator.continually(hashMap.headOption).takeWhile(_.isDefined).flatten
for ((key, value) <- it) {
    hashMap.remove(key)
    ... //do something here with value
}