我正在进行课程学习课程,正在完成第3周的任务。我完成了一半的功能。坚持使用过滤方法。我不想要答案,我想要的是理解或暗示我所缺少的东西。
以下是要求:
/ ** *此方法接受谓词并返回所有元素的子集 *在谓词为真的原始集合中。 * /
def filter(p: Tweet => Boolean): TweetSet = ???
这是我的代码:
override def filter(p: Tweet => Boolean): TweetSet = filterAcc(p, new Empty)
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
if(this.isEmpty)
acc
else if (p ( elem)) {
left.filterAcc(p, acc incl elem)
right.filterAcc(p, acc incl elem)
}
else
{
left.filterAcc(p, acc )
right.filterAcc(p, acc )
}
更新:为此问题添加更多上下文。这是基类:
abstract class TweetSet {
def filter(p: Tweet => Boolean): TweetSet = ???
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet
def union(that: TweetSet): TweetSet = ???
def isEmpty: Boolean = ???
def incl(tweet: Tweet): TweetSet
def contains(tweet: Tweet): Boolean
}
我有两个实现Empty和NonEmpty表示包含和不包含任何元素的集合。
测试用例:
val set1 = new Empty
val set2 = set1.incl(new Tweet("a", "a body", 20))
val set3 = set2.incl(new Tweet("b", "b body", 20))
val c = new Tweet("c", "c body", 7)
val d = new Tweet("d", "d body", 9)
val set4c = set3.incl(c)
val set4d = set3.incl(d)
val set5 = set4c.incl(d)
test("filter: a on set5") {
new TestSets {
assert(size(set5.filter(tw => tw.user == "a")) === 1) // this fails
}
}
结果:
[info] - 过滤:a on set5 * FAILED * [info] 0不等于1(TweetSetSuite.scala:64)
答案 0 :(得分:2)
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
val set = if(p(elem)) acc.incl(elem) else acc
right.filterAcc(p, left.filterAcc(p, set))
}
基本上你需要记住你必须过滤3'组':elem,left和right,然后组合它们(join)