如何在Scala中基于两个列表构建嵌套的Java TreeMap?
Scala 实现嵌套TreeMap的高效方案
以下分别给出Scala原生TreeMap和Java TreeMap两种实现:
前置定义
两个原始列表定义如下:
private val a = List(0, 100000, 500000, 1000000) private val b = List(0, 5, 25, 50)
1. Scala原生TreeMap实现
不可变版本(适合只读场景,内存效率最高)
不可变TreeMap可安全复用内层实例,避免重复构建:
import scala.collection.immutable.TreeMap // 预构建内层模板,所有外层键复用同一个实例 private val innerTemplate = TreeMap.from(b.map(k => k -> 0)) val nestedScalaTreeMap: TreeMap[Int, TreeMap[Int, Int]] = TreeMap.from(a.map(k => k -> innerTemplate))
可变版本(适合需要后续修改内层值的场景)
import scala.collection.mutable.TreeMap val nestedMutableScalaTreeMap = TreeMap.from( a.map(outerKey => outerKey -> TreeMap.from(b.map(innerKey => innerKey -> 0)) ) )
2. Java TreeMap实现(Scala调用)
只读场景(复用内层模板)
import java.util.TreeMap // 预构建内层模板 private val javaInnerTemplate = new TreeMap[Int, Int]() b.foreach(k => javaInnerTemplate.put(k, 0)) val nestedJavaTreeMap = new TreeMap[Int, TreeMap[Int, Int]]() a.foreach(outerKey => nestedJavaTreeMap.put(outerKey, javaInnerTemplate))
可修改场景(每次新建内层实例)
import java.util.TreeMap val nestedJavaTreeMap = new TreeMap[Int, TreeMap[Int, Int]]() a.foreach { outerKey => val inner = new TreeMap[Int, Int]() b.foreach(k => inner.put(k, 0)) nestedJavaTreeMap.put(outerKey, inner) }
效率说明
- 只读场景下复用内层模板,可将时间复杂度从O(m*n log n)降到O(m log m + n log n),其中m为列表a的长度、n为列表b的长度,是该需求下的最优复杂度
- 批量调用集合工厂方法构建实例,比逐个插入元素性能更高
内容的提问来源于stack exchange,提问作者Lumos
相关产品推荐
相关产品推荐

