我正在使用 Scala 2.11 并且我正在嘗試更新樹圖中鍵的值。我嘗試使用更新:
private val xyz = List(0, 100000, 500000, 1000000)
private val abc = List (0, 5, 25, 50)
private var a = TreeMap.empty[Int, TreeMap[Int, Int]] xyz.map {
aa => aa -> (TreeMap.empty[Int, Int] abc.map(bb => bb -> 0))
}
a(xyz(0)).foreach {
case (key, value) =>
if (key < 50) {
a(xyz(0)) = a(xyz(0)).updated(key, 5)
}
}
并得到錯誤:
value update is not a member of scala.collection.immutable.TreeMap[Int,scala.collection.immutable.TreeMap[Int,Int]]
可以更新嗎?或者有人可以幫助我使用 Java 樹圖復制邏輯,因為這也將允許我使用 floorEntry 和 purgeEntry 函式。我嘗試轉換為 java 樹圖,它生成了一個常規地圖,而不是樹圖:
private var a = TreeMap.empty[Int, TreeMap[Int, Int]] xyz.map {
aa => aa -> (TreeMap.empty[Int, Int] abc.map(bb => bb -> 0)).asJava
}
private var b = a.asJava
uj5u.com熱心網友回復:
您在var/val和之間感到困惑mutable/immutable。
我認為您正確理解了val和之間的區別var,前者是一個不可變的變數,而后者是可變的。即,如果您嘗試重新分配已分配的物件,val則會出現錯誤。
import scala.collection.immutable.TreeMap
val tm = TreeMap(1 -> 1, 2 -> 2, 3 -> 3)
tm = TreeMap(1->2)
^
error: reassignment to val
但是 avar可以變異:
import scala.collection.immutable.TreeMap
var tm = TreeMap(1 -> 1, 2 -> 2, 3 -> 3)
tm = TreeMap(1->2)
// mutated tm
請注意,在后一種情況下,即使我們正在改變變數,我們也不會改變集合本身,我們正在分配一個新的TreeMap. 當我們使用scala.collection.immutable.TreeMap它時,它不能被改變。
相反,如果我們使用了scala.collection.mutable.TreeMap,它有一個update函式
import scala.collection.mutable.TreeMap
val tm = TreeMap(1 -> 1, 2 -> 2, 3 -> 3)
tm.update(1, 5)
tm //TreeMap(1 -> 5, 2 -> 2, 3 -> 3)
一旦您更改scala.collection.immutable.TreeMap為scala.collection.mutable.TreeMap,這將起作用
a(xyz(0)).foreach{ case (key, value) =>
if(key < 50){
a(xyz(0)) = a(xyz(0)).updated(key, 5) //addOne(key, 5) if 2.13
}
}
編輯使用java.util.TreeMap
private val xyz = List(0, 100000, 500000, 1000000)
private val abc = List(0, 5, 25, 50)
import java.util.{TreeMap => JTreeMap}
val jTreeMap = xyz.foldLeft(new JTreeMap[Int, JTreeMap[Int, Int]]()) { (acc, elem) =>
acc.put(
elem,
abc.foldLeft(new JTreeMap[Int, Int]()) { (acc2, elem2) =>
acc2.put(elem2, 0)
acc2
}
)
acc
}
//Map created
jTreeMap.get(xyz.head).replaceAll{
//hack for scala 2.11.x
new java.util.function.BiFunction[Int, Int, Int]{
def apply(key: Int, value: Int) = if (value < 5) 5 else value
}
}
//value edited
uj5u.com熱心網友回復:
無法更新不可變物件,只能從舊物件創建新的不可變物件。因此,代碼需要根據需要TreeMap從原始代碼創建一個具有不同值的新代碼。
代碼如下所示:
val newMap = a.map{
case (k, v) if k == xyz(0) =>
k -> v.map {
case (k2, v2) if k2 < 50 =>
k2 -> 5
case (k2, v2) =>
k2 -> v2
}
case (k, v) =>
k -> v
}
這分解為在外部map查找匹配鍵的外部TreeMap和在內部map查找匹配鍵的內部TreeMap。模式匹配 ( case) 用于實作匹配測驗,也用于提取鍵和值。
每個map都有一個case選擇要修改的值,還有一個保持其他值不變的第二種情況。第一種情況回傳帶有修改值的原始鍵,而第二種情況只回傳原始值 ( k -> v)。
還要注意,var適用于變數,而不是變數的內容。它指示是否可以更新變數以參考不同的物件,但沒有說明變數參考的物件是否可以更新。var在 Scala 中很少使用,因為它違背了簡潔的功能設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377868.html
