我有一种set和union函数,如下所示
type Set = Int => Boolean
def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e)
val xs = Set(12001,12002, 12003, 12004)
val ys = Set(13001,13002, 13003, 13004)
当我使用联合操作时,
union(xs,ys)
它应该返回另一个包含两个集xs
和ys
编辑部分:
我很抱歉我不明白我的问题,我有自己的Set xs和ys迭代器的实现
var i = xs.iterator;
while(i.hasNext)
println(i.next())
但是我对这个实现不满意,发现你可以用函数实现条件(在谷歌搜索之后),但是我无法在eclipse工作表中使用它。
val rs = union(xs,ys) //> rs : Learn2.Set = <function1>
我猜它会返回一个函数。
所以我的问题,
1.是否可以按照编辑部分中的描述实施?如果是这样,那么我错过了什么让它工作?
2.我不明白e
中的元素(e: Int) => s(e) || t(e)
如何迭代两个集合中的元素
答案 0 :(得分:2)
查看您的Set
类型:Int => Boolean
。因此需要Int
并返回Boolean
。这意味着它是不一个集合,你可以迭代它来检索它的所有值,因为它实际上不包含任何值。
如果您想知道Int
值返回true
,那么您必须迭代整个可能的输入范围(或其某些子集)并过滤您正在寻找的条件。
scala> val res = union(xs,ys)
res: Set = $$Lambda$1091/332405156@2c30c81d
scala> (0 to 20000).filter(res).foreach(println)
12001
12002
12003
12004
13001
13002
13003
13004
scala>
<强>更新强>
您的困惑源于您在标准库中的现有集合之后命名了您的函数。 xs.itorator
有效,因为xs
不是您Set
的一个示例,它是标准库中的Set
,包含所有相关方法。将您的类型别名重命名为Xet
,您就会明白我的意思。
type Xet = Int => Boolean
def union(s: Xet, t: Xet): Xet = (e: Int) => s(e) || t(e)
val xx: Xet = _ == 12001
val yx: Xet = _ == 13002
val zx: Xet = union(xx, yx)
xx.itrerator // Error, won't compile
(1 to 20000).filter(zx).foreach(println) // output: 12001 & 13002