Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的定长分拣地图_Scala_Data Structures - Fatal编程技术网

Scala中的定长分拣地图

Scala中的定长分拣地图,scala,data-structures,Scala,Data Structures,我是Scala新手,Scala支持固定长度的SortedMap吗 我想到的是一张地图,它具有以下功能: 在创建时接受max_size参数 添加时,检查是否已存在最大大小元素 如果有,首先删除最小的键及其值(键将是Int) 然后将键和值添加到映射中 严格地说,我不需要对地图进行排序,但是如果我们删除最小的键,它似乎是必要的/可用的 我想在开始自己动手之前问一下。我还将在Samza下运行它,我相信它是单线程的,所以并发性不会成为一个问题 我在scala 2.10上您可以基于TreeMap做一

我是Scala新手,Scala支持固定长度的SortedMap吗

我想到的是一张地图,它具有以下功能:

  • 在创建时接受max_size参数
  • 添加时,检查是否已存在最大大小元素
    • 如果有,首先删除最小的键及其值(键将是Int)
    • 然后将键和值添加到映射中
严格地说,我不需要对地图进行排序,但是如果我们删除最小的键,它似乎是必要的/可用的

我想在开始自己动手之前问一下。我还将在Samza下运行它,我相信它是单线程的,所以并发性不会成为一个问题


我在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),结果将不太正确。我想按照您的方式编写它,但我遵循了您的要求-删除最小的元素,然后添加。这两种方法都适用于不同的情况。我想用您的方式编写,但我遵循了您的要求—删除最小的,然后添加。这两种方法都适用于不同的情况。我想用您的方式编写,但我遵循了您的要求—删除最小的,然后添加。两者都适用于不同的情况。