首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala是将集合转换为Map-by-key的最佳方式吗?

Scala是将集合转换为Map-by-key的最佳方式吗?
EN

Stack Overflow用户
提问于 2009-03-23 18:26:59
回答 12查看 165.1K关注 0票数 172

如果我有一个类型为T的集合c,并且在T上有一个属性p (比如类型为P ),那么通过提取键来实现映射的最佳方法是什么

代码语言:javascript
复制
val c: Collection[T]
val m: Map[P, T]

一种方法是:

代码语言:javascript
复制
m = new HashMap[P, T]
c foreach { t => m add (t.getP, t) }

但是现在我需要一个可变的映射。有没有更好的方法这样做,使它在一行中,并且我最终得到一个不可变的Map?(显然,我可以将上面的代码转换为一个简单的库实用程序,就像在Java中一样,但我怀疑在Scala中没有必要)

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2010-07-15 02:56:25

您可以使用

代码语言:javascript
复制
c map (t => t.getP -> t) toMap

但请注意,这需要2次遍历。

票数 248
EN

Stack Overflow用户

发布于 2009-03-23 21:11:37

您可以构造一个具有可变数量的元组的Map。因此,在集合上使用映射方法将其转换为元组的集合,然后使用:_*技巧将结果转换为变量参数。

代码语言:javascript
复制
scala> val list = List("this", "maps", "string", "to", "length") map {s => (s, s.length)}
list: List[(java.lang.String, Int)] = List((this,4), (maps,4), (string,6), (to,2), (length,6))

scala> val list = List("this", "is", "a", "bunch", "of", "strings")
list: List[java.lang.String] = List(this, is, a, bunch, of, strings)

scala> val string2Length = Map(list map {s => (s, s.length)} : _*)
string2Length: scala.collection.immutable.Map[java.lang.String,Int] = Map(strings -> 7, of -> 2, bunch -> 5, a -> 1, is -> 2, this -> 4)
票数 22
EN

Stack Overflow用户

发布于 2009-03-24 18:39:42

除了@James Iry的解决方案之外,还可以使用fold来实现这一点。我怀疑这种解决方案比元组方法稍微快一点(创建的垃圾对象更少):

代码语言:javascript
复制
val list = List("this", "maps", "string", "to", "length")
val map = list.foldLeft(Map[String, Int]()) { (m, s) => m(s) = s.length }
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/674639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档