Scala中的定长分拣地图
我是Scala新手,Scala支持固定长度的SortedMap吗 我想到的是一张地图,它具有以下功能:Scala中的定长分拣地图,scala,data-structures,Scala,Data Structures,我是Scala新手,Scala支持固定长度的SortedMap吗 我想到的是一张地图,它具有以下功能: 在创建时接受max_size参数 添加时,检查是否已存在最大大小元素 如果有,首先删除最小的键及其值(键将是Int) 然后将键和值添加到映射中 严格地说,我不需要对地图进行排序,但是如果我们删除最小的键,它似乎是必要的/可用的 我想在开始自己动手之前问一下。我还将在Samza下运行它,我相信它是单线程的,所以并发性不会成为一个问题 我在scala 2.10上您可以基于TreeMap做一
- 在创建时接受max_size参数
- 添加时,检查是否已存在最大大小元素
- 如果有,首先删除最小的键及其值(键将是Int)
- 然后将键和值添加到映射中
我在scala 2.10上您可以基于
TreeMap
做一些简单的事情,它保证元素按键排序:
import scala.collection.immutable.TreeMap
def add[K,V](map: TreeMap[K,V], elem: (K,V), maxSize: Int): TreeMap[K,V] = {
map.takeRight(maxSize - 1) + elem
}
以下是如何使用它:
scala> val m = TreeMap(1 -> "one", 2 -> "two", 3 -> "three")
m: scala.collection.immutable.TreeMap[Int,String] =
Map(1 -> one, 2 -> two, 3 -> three)
scala> val m1 = add(m, 0 -> "zero", 4)
m1: scala.collection.immutable.TreeMap[Int,String] =
Map(0 -> zero, 1 -> one, 2 -> two, 3 -> three)
scala> val m2 = add(m1, 4 -> "four", 4)
m2: scala.collection.immutable.TreeMap[Int,String] =
Map(1 -> one, 2 -> two, 3 -> three, 4 -> four)
scala> val m3 = add(m2, 5 -> "five", 4)
m3: scala.collection.immutable.TreeMap[Int,String] =
Map(2 -> two, 3 -> three, 4 -> four, 5 -> five)
scala> val m4 = add(m3, 0 -> "zero", 4)
m4: scala.collection.immutable.TreeMap[Int,String] =
Map(0 -> zero, 3 -> three, 4 -> four, 5 -> five)
显然,您可以尝试使其更方便,以满足您的需要。您可以基于
树形图来执行类似的简单操作,该树形图保证元素按键排序:
import scala.collection.immutable.TreeMap
def add[K,V](map: TreeMap[K,V], elem: (K,V), maxSize: Int): TreeMap[K,V] = {
map.takeRight(maxSize - 1) + elem
}
以下是如何使用它:
scala> val m = TreeMap(1 -> "one", 2 -> "two", 3 -> "three")
m: scala.collection.immutable.TreeMap[Int,String] =
Map(1 -> one, 2 -> two, 3 -> three)
scala> val m1 = add(m, 0 -> "zero", 4)
m1: scala.collection.immutable.TreeMap[Int,String] =
Map(0 -> zero, 1 -> one, 2 -> two, 3 -> three)
scala> val m2 = add(m1, 4 -> "four", 4)
m2: scala.collection.immutable.TreeMap[Int,String] =
Map(1 -> one, 2 -> two, 3 -> three, 4 -> four)
scala> val m3 = add(m2, 5 -> "five", 4)
m3: scala.collection.immutable.TreeMap[Int,String] =
Map(2 -> two, 3 -> three, 4 -> four, 5 -> five)
scala> val m4 = add(m3, 0 -> "zero", 4)
m4: scala.collection.immutable.TreeMap[Int,String] =
Map(0 -> zero, 3 -> three, 4 -> four, 5 -> five)
显然,你可以试着让它更方便地满足你的需要。阿列克西的回答很有帮助。我对它做了一个小小的修改
import scala.collection.immutable.TreeMap
def add[K,V](map: TreeMap[K,V], elem: (K,V), maxSize: Int): TreeMap[K,V] = {
(map + elem).takeRight(maxSize - 1)
}
val m = TreeMap(1 -> "one", 2 -> "two", 3 -> "three")
val m1 = add(m, 0 -> "zero", 4)
val m2 = add(m1, 4 -> "four", 4)
val m3 = add(m2, 0 -> "zero", 4)
val m4 = add(m3, 1 -> "one", 4)
val m5 = add(m4, 0 -> "zero", 4)
val m6 = add(m5, 1 -> "one", 4)
阿列克西的回答很有帮助。我对它做了一个小小的修改
import scala.collection.immutable.TreeMap
def add[K,V](map: TreeMap[K,V], elem: (K,V), maxSize: Int): TreeMap[K,V] = {
(map + elem).takeRight(maxSize - 1)
}
val m = TreeMap(1 -> "one", 2 -> "two", 3 -> "three")
val m1 = add(m, 0 -> "zero", 4)
val m2 = add(m1, 4 -> "four", 4)
val m3 = add(m2, 0 -> "zero", 4)
val m4 = add(m3, 1 -> "one", 4)
val m5 = add(m4, 0 -> "zero", 4)
val m6 = add(m5, 1 -> "one", 4)
可能的副本没有默认集合。但在scala中,您应该使用不可变对象,因此贴图不应该更改其大小(add将返回不同的贴图)。尽管如此,可能还有一些这样的集合注意:scala 2.12即将推出(已经推出?),您应该已经迁移到2.11:)的可能副本的可能副本没有默认集合。但在scala中,您应该使用不可变对象,因此贴图不应该更改其大小(add将返回不同的贴图)。尽管如此,也许还有一些关于这一点的收集说明:scala 2.12即将面世(已经面世了?),您应该已经迁移到2.11:)可能是重复的谢谢!这很有帮助。我发现了一个小错误,如果您不断添加小于集合中最小元素的元素(例如,如果最小键为2,您添加的是0),结果将不太正确。我想按照您的方式编写它,但我遵循了您的要求-删除最小的元素,然后添加。两者都适用于不同的情况。谢谢!这很有帮助。我发现了一个小错误,如果您不断添加小于集合中最小元素的元素(例如,如果最小键为2,您添加的是0),结果将不太正确。我想按照您的方式编写它,但我遵循了您的要求-删除最小的元素,然后添加。这两种方法都适用于不同的情况。我想用您的方式编写,但我遵循了您的要求—删除最小的,然后添加。这两种方法都适用于不同的情况。我想用您的方式编写,但我遵循了您的要求—删除最小的,然后添加。两者都适用于不同的情况。