在Scala中更新ListMap并保持顺序

在Scala中更新ListMap并保持顺序,scala,Scala,我有一个基本的不可变列表映射,它很好地保留了项目的顺序。但是,我想在某个时候更新ListMap中的现有键,但该特定键的顺序丢失 val myListMap = ListMap(1 -> "foo", 2 -> "bar") val myListMap2 = myListMap.updated(1, "foo2") // myListMap2: ListMap[Int,String] = Map(2 -> bar, 1 -> foo2) 如何更新ListMap而不丢失现有

我有一个基本的不可变列表映射,它很好地保留了项目的顺序。但是,我想在某个时候更新ListMap中的现有键,但该特定键的顺序丢失

val myListMap = ListMap(1 -> "foo", 2 -> "bar")
val myListMap2 = myListMap.updated(1, "foo2")
// myListMap2: ListMap[Int,String] = Map(2 -> bar, 1 -> foo2)

如何更新ListMap而不丢失现有键的位置?

构建ListMap的方式只是巧合
ListMap本身并不是一个真正定义的API,只是
Map
的一个实现。我建议改为使用抽象类型,即
Map(1->“foo”,2->“bar”)

如果需要对地图进行排序,请使用专用的
SortedMap
界面

import collection.immutable.SortedMap
val m0 = SortedMap(1 -> "foo", 2 -> "bar")
val m1 = m0.updated(1, "baz")
val m2 = m1 + (0 -> "abc")

构建
ListMap
的方式只是巧合
ListMap本身并不是一个真正定义的API,只是
Map
的一个实现。我建议改为使用抽象类型,即
Map(1->“foo”,2->“bar”)

如果需要对地图进行排序,请使用专用的
SortedMap
界面

import collection.immutable.SortedMap
val m0 = SortedMap(1 -> "foo", 2 -> "bar")
val m1 = m0.updated(1, "baz")
val m2 = m1 + (0 -> "abc")

构建
ListMap
的方式只是巧合
ListMap本身并不是一个真正定义的API,只是
Map
的一个实现。我建议改为使用抽象类型,即
Map(1->“foo”,2->“bar”)

如果需要对地图进行排序,请使用专用的
SortedMap
界面

import collection.immutable.SortedMap
val m0 = SortedMap(1 -> "foo", 2 -> "bar")
val m1 = m0.updated(1, "baz")
val m2 = m1 + (0 -> "abc")

构建
ListMap
的方式只是巧合
ListMap本身并不是一个真正定义的API,只是
Map
的一个实现。我建议改为使用抽象类型,即
Map(1->“foo”,2->“bar”)

如果需要对地图进行排序,请使用专用的
SortedMap
界面

import collection.immutable.SortedMap
val m0 = SortedMap(1 -> "foo", 2 -> "bar")
val m1 = m0.updated(1, "baz")
val m2 = m1 + (0 -> "abc")

如果您只是对Map API感兴趣,而不是对插入性能感兴趣,可以执行以下操作:

val myListMap = ListMap(1 -> "foo", 2 -> "bar")
val myListMap2 = myListMap.map(c => if(c._1 == 1) c._1 -> "foo2" else c)

插入顺序不会以这种方式改变。

如果您只对Map API感兴趣,而不是对插入性能感兴趣,可以执行以下操作:

val myListMap = ListMap(1 -> "foo", 2 -> "bar")
val myListMap2 = myListMap.map(c => if(c._1 == 1) c._1 -> "foo2" else c)

插入顺序不会以这种方式改变。

如果您只对Map API感兴趣,而不是对插入性能感兴趣,可以执行以下操作:

val myListMap = ListMap(1 -> "foo", 2 -> "bar")
val myListMap2 = myListMap.map(c => if(c._1 == 1) c._1 -> "foo2" else c)

插入顺序不会以这种方式改变。

如果您只对Map API感兴趣,而不是对插入性能感兴趣,可以执行以下操作:

val myListMap = ListMap(1 -> "foo", 2 -> "bar")
val myListMap2 = myListMap.map(c => if(c._1 == 1) c._1 -> "foo2" else c)

插入顺序不会以这种方式改变。

看起来SortedMap不够用。我需要保留一个特定的定制订单。一个更准确的例子:
ListMap(“color”->“green”,“country”->“Germany”)
那么你应该维护一个单独的
列表
向量
,这是一个线性序列。这似乎是一个可行的解决方案,但会带来很小的开销。你不能同时拥有O(1)
get
和随机稳定的插入顺序。您是否需要
Map
界面?如果您的集合不是非常大,您可以使用
indexOf
/
indexWhere
向量中查找元素。我发现地图很容易使用,因为我需要按键访问数据,键本身也有一个角色。工作集一点也不大。看起来SortedMap不够用。我需要保留一个特定的定制订单。一个更准确的例子:
ListMap(“color”->“green”,“country”->“Germany”)
那么你应该维护一个单独的
列表
向量
,这是一个线性序列。这似乎是一个可行的解决方案,但会带来很小的开销。你不能同时拥有O(1)
get
和随机稳定的插入顺序。您是否需要
Map
界面?如果您的集合不是非常大,您可以使用
indexOf
/
indexWhere
向量中查找元素。我发现地图很容易使用,因为我需要按键访问数据,键本身也有一个角色。工作集一点也不大。看起来SortedMap不够用。我需要保留一个特定的定制订单。一个更准确的例子:
ListMap(“color”->“green”,“country”->“Germany”)
那么你应该维护一个单独的
列表
向量
,这是一个线性序列。这似乎是一个可行的解决方案,但会带来很小的开销。你不能同时拥有O(1)
get
和随机稳定的插入顺序。您是否需要
Map
界面?如果您的集合不是非常大,您可以使用
indexOf
/
indexWhere
向量中查找元素。我发现地图很容易使用,因为我需要按键访问数据,键本身也有一个角色。工作集一点也不大。看起来SortedMap不够用。我需要保留一个特定的定制订单。一个更准确的例子:
ListMap(“color”->“green”,“country”->“Germany”)
那么你应该维护一个单独的
列表
向量
,这是一个线性序列。这似乎是一个可行的解决方案,但会带来很小的开销。你不能同时拥有O(1)
get
和随机稳定的插入顺序。您是否需要
Map
界面?如果您的集合不是非常大,您可以使用
indexOf
/
indexWhere
向量中查找元素。我发现地图很容易使用,因为我需要按键访问数据,键本身也有一个角色。工作组一点也不大。