我是 Scala 的新手,我看到人們訪問案例類的唯一方法是使用模式匹配。
我最近用下面的代碼解決了一個霍夫曼編碼問題
abstract class TreeNodes
case class Leaf(weight: Int, value: String) extends TreeNodes
case class Node(weights: Int, left: TreeNodes, right: TreeNodes) extends TreeNodes
// P50
def huffman(freq: List[(String,Int)]): List[(String,String)] = {
def makeNode(left: TreeNodes, right: TreeNodes): Node =
(left,right) match
case (Leaf(w1,_),Leaf(w2,_)) => Node(w1 w2, left,right)
case (Node(w1,_,_),Leaf(w2,_)) => Node(w1 w2, left ,right)
case (Leaf(w1,_), Node(w2,_,_)) => Node(w1 w2, left, right)
case (Node(w1,_,_), Node(w2,_,_)) => Node(w1 w2, left, right)
def makeLeaves(freq: List[(String,Int)]): List[TreeNodes] = freq.map((s: String, i: Int) => Leaf(i,s))
def makeTree(nodes: List[TreeNodes]): List[TreeNodes] = {
if nodes.size == 1 then nodes else {
val sortedNodes = nodes.sortBy(_ match {case Leaf(w,_) => w; case Node(w,_,_) => w})
makeTree(sortedNodes.appended(makeNode(sortedNodes.head,sortedNodes.tail.head)).drop(2))
}
}
def traverseTree(node: TreeNodes, acc: String): List[(String, String)] = {
node match
case Leaf(w, s) => List((s,acc))
case Node(w, left, right) => traverseTree(left, acc "0") ::: traverseTree(right, acc "1")
}
traverseTree(makeTree(makeLeaves(freq)).head, "").sortBy(_._1)
}
輸入和輸出應該是這樣的:
scala> huffman(List(("a", 45), ("b", 13), ("c", 12), ("d", 16), ("e", 9), ("f", 5)))
res0: List[String, String] = List((a,0), (b,101), (c,100), (d,111), (e,1101), (f,1100))
該代碼是正確的并產生所需的輸出。但是,我想將該makeNode函式重構為更簡潔的版本,因為所有案例都有相同的回報。
我想要一個更簡潔的版本。有沒有辦法為不同的案例類創建一個公共欄位,或者以任何其他方式在沒有模式匹配的情況下訪問案例類?
uj5u.com熱心網友回復:
只需在公共介面中宣告公共方法,在這種情況下,將def weight: Int或添加val weight: Int到基類中。
在 Scala 2.x 中:
sealed abstract class TreeNodes {
def weight: Int
}
case class Leaf(weight: Int, value: String) extends TreeNodes
case class Node(weight: Int, left: TreeNodes, right: TreeNodes) extends TreeNodes
//...
def makeNode(left: TreeNodes, right: TreeNodes): Node =
Node(left.weight right.weight, left,right)
在 Scala 3.x 中:
enum TreeNodes:
case Leaf(weight: Int, value: String)
case Node(weight: Int, left: TreeNodes, right: TreeNodes)
def weight: Int
但請記住匯入LeafandNode如果您希望其余代碼按原樣作業:import TreeNodes._.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/504775.html
上一篇:資料庫原理基礎一
