首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Coursera Scala 函數式編程 Week 3 作業詳解:TweetSet 實現

     編輯:C++ 入門

作業架構

抽象類 TweetSet 及兩個子類 Empty、NonEmpty(二叉搜索樹,按 tweet.text 排序)。所有操作 immutable,返回新集合。

核心方法實現

filter / filterAcc

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 收集符合條件元素。

union

def union(that: TweetSet): TweetSet =
  left.union(right.union(that.incl(elem)))

將當前根插入 that,再遞歸合併左右子樹。

mostRetweeted & descendingByRetweet

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

關鍵收穫

  • Immutable 數據結構 + 遞歸 = 函數式核心模式
  • 累加器模式 (filterAcc) 避免中間集合創建
  • 單例 Nil 對象模式實現空列表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved