【发布时间】:2019-05-01 05:11:21
【问题描述】:
我正在尝试在 scala 中找到等效的 assoc-in (clojure)。我正在尝试转换
(defn- organiseDataByTradeId [data]
(reduce #(let [a (assoc-in %1
[(%2 "internaltradeid") (read-string (%2 "paramseqnum")) "levelcols"]
(reduce (fn [m k](assoc m k (get %2 k)))
{}
(string/split xmlLevelAttributesStr #",")))
b (assoc-in a
[(%2 "internaltradeid") (read-string (%2 "paramseqnum")) "subLevelCols" (read-string (%2 "cashflowseqnum"))]
(reduce (fn [m k] (assoc m k (get %2 k)))
{}
(string/split xmlSubLevelAttributesStr #","))
)]
b)
{}
data))
到斯卡拉。 试过这个:
def organiseDataByTradeId(data: List[Map[String, String]]) = {
data.map { entry => Map(entry("internaltradeid") -> Map(entry("paramseqnum").toInt -> Map("levelcols" -> (xmlLevelAttributesStr.split(",")).map{key=> (key,entry(key))}.toMap,
"subLevelCols" -> Map(entry("cashflowseqnum").asInstanceOf[String].toInt -> (xmlSubLevelAttributesStr.split(",")).map{key=> (key,entry(key))}.toMap)))) }
}
不确定如何在不覆盖的情况下合并我获得的地图列表。 这里 data List[Map[String,String]] 基本上是在描述一个表。每个条目是一行。列名是映射的键,值是值。xmlLevelAttributeStr 和 xmlSubLevelAttributeStr 是两个字符串,其中列名用逗号分隔。 我对斯卡拉相当陌生。我将每一行(Map [String,String])转换为scala Map,现在不知道如何合并它们,以便以前的数据不会被覆盖并且行为与clojure代码完全相同。我也不允许使用外部库,例如斯卡拉兹。
【问题讨论】:
-
1.由于工作限制或面试要求,您不被允许? 2. 如果没有外部库,我要么将其拆分为多个函数,组合嵌套的
map、flatMap和updated,要么实现我自己的Traversal、Optional光学。 -
工作限制。我是 scala 的新手,因此不确定如何利用强大的模式匹配支持。我不确定我是否理解你所说的,你能否提供一个相同的示例实现?谢谢。
标签: scala dictionary merge clojure overwrite