Scala 中的有限稀疏集合
Finite sparse collection in Scala
我正在用 Scala 做一个 Base64 转换器,我想存储一组映射到索引的符号(字符)。在 Scala 中,Char 表示是 ASCII 码。但是,此符号集合具有不同的稀疏标识符,即 'A' 对应于 65,“+”对应于 43,并且在这些值之间没有有效符号。
我想做的是将 Base64 符号映射到 Base64 中的索引(即 'A' 为 0),以便解码给定的字符串。我想出了一个通用的简单解决方案:
trait SymbolsTable {
val symbols: IndexedSeq[Char] =
('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') ++ Seq('+', '/')
val decodingTable: Map[Char, Int] = symbols.zipWithIndex.toMap[Char, Int]
}
因此,我可以获得有效字符的任何索引:
val indexA: Int = table.decodingTable('A')
我只需要存储 64 个符号,我们通常使用 Map 来存储未定义数量的键。我很好奇是否可以使用其他数据结构作为 Vector(以密集方式,不浪费内存)以另一种原始方式完成此操作。
郑重声明,我认为这根本不值得优化,但只是为了好玩,你可以做这样的事情,这在内存方面真的很有效:)
def toBase64(c: Char): Int = c match {
case '+' => 63
case '/' => 64
case x if 'A' to 'Z' contains x => c - 'A'
case x if 'a' to 'z' contains x => c - 'a' + 26
case x if '0' to '9' contains x => c - '0' + 52
case _ => -1
}
我正在用 Scala 做一个 Base64 转换器,我想存储一组映射到索引的符号(字符)。在 Scala 中,Char 表示是 ASCII 码。但是,此符号集合具有不同的稀疏标识符,即 'A' 对应于 65,“+”对应于 43,并且在这些值之间没有有效符号。
我想做的是将 Base64 符号映射到 Base64 中的索引(即 'A' 为 0),以便解码给定的字符串。我想出了一个通用的简单解决方案:
trait SymbolsTable {
val symbols: IndexedSeq[Char] =
('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') ++ Seq('+', '/')
val decodingTable: Map[Char, Int] = symbols.zipWithIndex.toMap[Char, Int]
}
因此,我可以获得有效字符的任何索引:
val indexA: Int = table.decodingTable('A')
我只需要存储 64 个符号,我们通常使用 Map 来存储未定义数量的键。我很好奇是否可以使用其他数据结构作为 Vector(以密集方式,不浪费内存)以另一种原始方式完成此操作。
郑重声明,我认为这根本不值得优化,但只是为了好玩,你可以做这样的事情,这在内存方面真的很有效:)
def toBase64(c: Char): Int = c match {
case '+' => 63
case '/' => 64
case x if 'A' to 'Z' contains x => c - 'A'
case x if 'a' to 'z' contains x => c - 'a' + 26
case x if '0' to '9' contains x => c - '0' + 52
case _ => -1
}