如何在Scala中将所有值与相同的键组合在一起?

时间:2017-11-28 19:23:00

标签: scala

我有一张地图:

  if modelArray[indexPath.row].cotainAds {
      //return ads cell
     }
else {
 //return normal cell
}

使用相同的第一个键元素多次出现。

如何重新组合与键的第一个元素相对应的所有值?这将把这张地图变成:

val programming = Map(("functional", 1) -> "scala", ("functional", 2) -> "perl", ("orientedObject", 1) -> "java", ("orientedObject", 2) -> "C++")

4 个答案:

答案 0 :(得分:0)

根据您的编辑,您有一个看起来像这样的数据结构

val programming = Map(("functional", 1) -> "scala", ("functional", 2) -> "perl",
("orientedObject", 1) -> "java", ("orientedObject", 2) -> "C++")

并且您希望废弃数字索引并按字符串键分组。幸运的是,Scala提供了一个可以让你靠近的内置功能。<​​/ p>

programming groupBy { case ((k, _), _) => k }

这将返回一个新地图,其中包含原始子图,按我们从“部分”函数返回的关键字分组。但我们想要一个列表地图,所以让我们忽略子图中的键。

programming groupBy { case ((k, _), _) => k } mapValues { _.values }

这为我们提供了某种Iterable的地图。但我们确实需要列表,所以让我们采取最后一步并转换为列表。

programming groupBy { case ((k, _), _) => k } mapValues { _.values.toList }

答案 1 :(得分:0)

您应该尝试使用.groupBy方法

programming.groupBy(_._1._1)

你会得到

scala> programming.groupBy(_._1._1)
res1: scala.collection.immutable.Map[String,scala.collection.immutable.Map[(String, Int),String]] = Map(functional -> Map((functional,1) -> scala, (functional,2) -> perl), orientedObject -> Map((orientedObject,1) -> java, (orientedObject,2) -> C++))

现在可以通过执行以下操作来“清理”:

scala> res1.mapValues(m => m.values.toList)
res3: scala.collection.immutable.Map[String,List[String]] = Map(functional -> List(scala, perl), orientedObject -> List(java, C++))

答案 2 :(得分:0)

读取csv文件并创建一个包含键和值列表的映射。

 val fileStream = getClass.getResourceAsStream("/keyvaluepair.csv")
 val lines = Source.fromInputStream(fileStream).getLines

 var mp = Seq[List[(String, String)]]();
 var codeMap=List[(String, String)]();
 var res = Map[String,List[String]]();
 for(line <- lines )
 {
   val cols=line.split(",").map(_.trim())
   codeMap ++= Map(cols(0)->cols(1))
 }
 res = codeMap.groupBy(_._1).map(p => p._1 -> p._2.map(_._2)).toMap

答案 3 :(得分:0)

由于没有人按照他要求的顺序进行订购:

programming.groupBy(_._1._1)
    .mapValues(_.toSeq.map { case ((t, i), l) => (i, l) }.sortBy(_._1).map(_._2))