斯卡拉通过与条件
在组I型有型组和工会作用的迭代如下斯卡拉通过与条件
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操作,
union(xs,ys)
它应该返回我的另一个一套包含两套的所有元素xs
和ys
编辑部分:
对不起,我是不是清楚我的问题,我有我自己的实现迭代器的两个集X和Y
var i = xs.iterator;
while(i.hasNext)
println(i.next())
但我并不满足于此实施和发现你可以用函数实现条件(一些谷歌搜索后),但我无法让它在我的eclipse工作表中工作。
val rs = union(xs,ys) //> rs : Learn2.Set = <function1>
我猜测它返回一个函数。
所以我的问题, 1.是否有可能执行如上所述的编辑部分?如果是这样,那么我错过了什么让它工作? 2.我不知道如何在(e: Int) => s(e) || t(e)
元素e
的迭代中的元素都
看看你Set
类型的集:Int => Boolean
。所以需要Int
并返回Boolean
。这意味着它是而不是您可以迭代的集合来检索其所有值,因为它实际上不包含任何值。
如果你想知道什么Int
值返回true
那么你必须遍历可能的输入(或其一些子集)和过滤器,你要寻找的条件的整个范围。
scala> val res = union(xs,ys)
res: Set = $$Lambda$1091/[email protected]
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
嘿,感谢您的更新。 我能够迭代我的设置,如下所示:var i = xs.iterator; while(i.hasNext)println(i.next())''但我无法让'union()'函数工作。我已经更新了我的问题,因为我不清楚。 –
@RockwellSydney,看我的更新。 – jwvh
是的,你是对的。我是新来的这个scala类型,让我做一些挖掘,然后回复你:) –
你的工会功能似乎很好。你会有什么困惑? –
你的实际问题是什么? –
你的建议听起来很对。 :-) – stefanobaghino