我有一张地图:
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++")
答案 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))