scala使用条件迭代set类型

时间:2017-02-13 04:48:09

标签: scala

我有一种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)

它应该返回另一个包含两个集xsys

的所有元素的集合
  

编辑部分:

我很抱歉我不明白我的问题,我有自己的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)如何迭代两个集合中的元素

1 个答案:

答案 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