优雅的地图实施

时间:2011-06-05 16:43:36

标签: list scala collections map set

有一个要与另一个列表进行比较的有序字符串列表,我决定实现一个作为映射,其中键是字符串的第一个字符串,值是具有相同第一个字符串的字符串列表。 总之,我有这样的东西:

var list1:Map[Char, List[String]] = Map('a' -> List("alone", "away"))
var list2:List[String] = List("I", "am", "alone", "at", "home", "watching", "batman", "XD")

现在,以这种方式实现了我的代码,与他们一起努力将第一个作为一个简单的列表考虑是很难的,所以我想知道是否还有另一种更优雅的方法来解决这个问题。 如果我必须验证list1是否“单独”,我必须首先获得密钥'a'然后调用方法包含。我不得不实施这样的事情。

if ( list1( "alone".charAt(0) ).contains( "alone" ) ) ...

每次提取密钥然后比较列表都很难看,我想创建一个新的地图(或列表)来实现这一点(它自动提取密钥,然后继续工作列表)。 你有什么建议? 感谢。

编辑:我重写了部分问题,澄清了一些观点。 第一个列表是有序的,第二个是没有。

2 个答案:

答案 0 :(得分:4)

从我看到的所有内容中你真的只想要一个清单。所以使用List。 (或者可能是SortedSet http://www.scala-lang.org/api/current/scala/collection/SortedSet.html

您似乎关注性能,但您既没有说明哪个算法的哪个部分要慢,也没有说明它需要多快的速度,也没有提供合理的论据,表明您选择的方法确实符合这些性能要求。再说一次:只使用List。然后测量性能。如果真的要放慢速度,请在此处创建一个基准测试代码和结果,并说明它需要多快。

然后人们就可以提供帮助。

答案 1 :(得分:0)

我不确定为什么使用地图会帮助你比较字符串列表,但无论如何:

如果您不介意使用可变集合,并且您确定列表中没有重复(因此您实际上可以使用集合),那么您可以使用MultiMap特征:

import scala.collection.mutable._
val mm = new HashMap[Char,Set[String]] with MultiMap[Char,String]
Seq("alone","away").foreach(s => mm.addBinding(s(0),s))

scala> mm
res2: scala.collection.mutable.HashMap[Char,scala.collection.mutable.Set[String]]
 with scala.collection.mutable.MultiMap[Char,String] = 
 Map(a -> Set(alone, away))

scala> mm.entryExists('a',"alone")

不幸的是,当您使用集合操作时,多重映射会消失(它只是从CharSet[String]的简单映射。