抽象類 TweetSet 及兩個子類 Empty、NonEmpty(二叉搜索樹,按 tweet.text 排序)。所有操作 immutable,返回新集合。
def filter(p: Tweet => Boolean): TweetSet = filterAcc(p, new Empty)
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
if (p(elem)) left.filterAcc(p, right.filterAcc(p, acc.incl(elem)))
else left.filterAcc(p, right.filterAcc(p, acc))
}
遞歸遍歷左右子樹,累加器 acc 收集符合條件元素。
def union(that: TweetSet): TweetSet = left.union(right.union(that.incl(elem)))
將當前根插入 that,再遞歸合併左右子樹。
def mostRetweeted: Tweet = {
val leftMax = left.mostRetweeted
val rightMax = right.mostRetweeted
List(elem, leftMax, rightMax).maxBy(_.retweets)
}
def descendingByRetweet: TweetList = {
val max = mostRetweeted
if (max.retweets == -1) Nil
else new Cons(max, remove(max).descendingByRetweet)
}
遞歸找最大轉發量 tweet,構建降序列表。
lazy val googleTweets = allTweets.filter(t => googleKeywords.exists(t.text.contains)) lazy val appleTweets = allTweets.filter(t => appleKeywords.exists(t.text.contains)) lazy val trending = (googleTweets union appleTweets).descendingByRetweet
filterAcc) 避免中間集合創建Nil 對象模式實現空列表