scala - 如何获取 SortedSet 中项目的索引

标签 scala sortedset

我正在实现某种“记录矩阵”,其中轴索引是某种类型 K(例如字符串)的(唯一)键。这些键不需要排序,但我需要一个顺序,所以我选择了一个 SortedSet。

键 (SortedSet) 的主要目的是在底层二维数据数组(Seq[Seq[.]] 或其他)中找到实际的整数索引。 但是我找不到获得这样的 f(key: K): Int 函数的方法。

我可以使用 Map[K,Int] 而不是 SortedSet[K],它的值是索引,但我发现这有点矫枉过正(而且不太好输入)。

有什么想法吗?

编辑

Map 方法类似于,但在 2D 中:

val myKeys = // SortedSet("A", "B", "C")
val data   = // Array(13,42,117)
val keyIndices = myKeys.zipWithIndex.toMap

// get indices of "B", and lookup in data array
data(keyIndices("B"))

我为 Map 解决方案写了“类型不正确”,因为类型不保证索引是连续的并且从 0 开始。而有序序列中的位置是。

选定的解决方案

我选择了Neumann's answer因为它最适合我的实际问题。但是Cipcigan'sVerkerk's答案更适合标题。

最佳答案

简答

保持 Set 你不能。 Seq 的一个特点是能够通过索引获取元素。

scala> val data =scala.collection.SortedSet("a", "l", "m", "o", "n", "d")
data: scala.collection.SortedSet[String] = TreeSet(a, d, l, m, n, o)

scala> data(1)
<console>:12: error: type mismatch;
found   : Int(1)
required: String
   data(1)
        ^

scala> data("a")
res3: Boolean = true

在这个例子中,apply 方法检查给定的参数是否包含在集合中。

我会采用您已经通过使用 Map 建议的方法。或者将数据转换为 Seq

scala> val indexedData = data.toVector
indexedData: Vector[String] = Vector(a, d, l, m, n, o)

scala> indexedData(2)
res9: String = l

scala> indexedData.indexOf("l")
res1: Int = 2

关于scala - 如何获取 SortedSet 中项目的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222677/

相关文章:

scala - 如何表达(隐式conv : String => A) as a view bound

scala - Scala Char 有多少字节?

c# - .NET 中的数据结构,将项目存储为已排序且唯一且可按范围查询(并且不是 SortedSet)

redis - 如何与redis的排序集相交?

redis - 如何保留前 10 个成员并删除 Redis 排序集的其余部分?

ide - 如何为 Scala 项目配置 jEdit?

Scala 不可变 Set 是可变的吗?

scala - 很好的scalaz介绍

java - 为什么在 SortedSet 中查找 headSet 时附加空字符 "\0"?

Redis : Sorted sets for specific SMEMBERS