2017-06-07 20 views
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)

+1

從單獨的代碼片段中,很難理解您的數據結構。什麼是「這個」,什麼是「左」和「右」等。你知道列表上的過濾器是如何工作的嗎?你究竟在哪裏卡住?你有一些失敗的測試用例嗎? – stholzm

+0

感謝您的回覆。我知道如何過濾應該工作,我的問題是與累加器不按預期工作。基本上,累加器在執行時不保存正確的值。將測試用例添加到主要問題中。 – kromastorm

+2

我選擇讓'filter()'在'TweetSet'定義中保持抽象,並將實現放在子類中。 「空」執行是微不足道的。 NonEmpty執行是一個單獨的if/else語句。 – jwvh

回答

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,左,右,然後將它們結合起來(加入)