0
我在做coursera scala课程,在第3周的作业上工作。我完成了一半的功能。用过滤器方法卡住。我不想要答案,我想要的是理解或暗示我缺少的东西。Coursera Scala第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
}
}
结果:
[信息] - 滤波器:一个上SET5 * FAILED * [信息] 0不等于1(TweetSetSuite.scala:64)
从单独的代码片段中,很难理解您的数据结构。什么是“这个”,什么是“左”和“右”等。你知道列表上的过滤器是如何工作的吗?你究竟在哪里卡住?你有一些失败的测试用例吗? – stholzm
感谢您的回复。我知道如何过滤应该工作,我的问题是与累加器不按预期工作。基本上,累加器在执行时不保存正确的值。将测试用例添加到主要问题中。 – kromastorm
我选择让'filter()'在'TweetSet'定义中保持抽象,并将实现放在子类中。 “空”执行是微不足道的。 NonEmpty执行是一个单独的if/else语句。 – jwvh