2015-01-07 54 views
0

我正在做Scala中的Base64转换器,我想存储映射到索引的符号集(字符)。在Scala中,Char表示是ASCII码。然而,这个符号集合具有不同的稀疏标识符,即'A'对应于65,'+'对应于43,并且在这些值之间没有有效符号。Scala中的有限稀疏集合

我想要做的是将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个符号和我们平时使用的地图存储的未定义的键数量。我很好奇,如果这可以以另一种原始的方式使用其他数据结构作为Vector(以密集的方式,而不浪费内存)来完成。

+0

稀疏集合存在于https://github.com/non/spire中,尽管其他解决方案可能对此特定任务更好。 –

+0

你认为哪一个更好? –

+2

我会去现有的图书馆。我猜这里有(http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Decoder.html)在JVM上非常好 - 已经过优化,经过测试的解决方案,但可能你有不同的要求。 –

回答

0

为了记录在案,我不认为这是值得优化可言,只是为了好玩,你可以做这样的事情,那将是非常高效的内存明智:)

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 
} 
+0

使用currying('toBase64 _'),你甚至可以创建一个函数,就像'Map'一样。 :) –