无循环scala映射中的条件分组
在scala映射中,是否可以只对符合给定条件的特定元素进行分组 发件人:无循环scala映射中的条件分组,scala,maps,Scala,Maps,在scala映射中,是否可以只对符合给定条件的特定元素进行分组 发件人: val map = Map(((1,true,"case0")->List(1,2,3)), ((2,true,"case0")->List(3,4,5)), ((1,true,"case1")->List(2,4,6)), ((2,false,"case1")->List(3))) Map(((1,true,"nocase")->List(2)), ((2,true,"case0")
val map = Map(((1,true,"case0")->List(1,2,3)), ((2,true,"case0")->List(3,4,5)),
((1,true,"case1")->List(2,4,6)), ((2,false,"case1")->List(3)))
Map(((1,true,"nocase")->List(2)), ((2,true,"case0")->List(3,4,5)),
((2,false,"case1")->List(3)))
至:
val map = Map(((1,true,"case0")->List(1,2,3)), ((2,true,"case0")->List(3,4,5)),
((1,true,"case1")->List(2,4,6)), ((2,false,"case1")->List(3)))
Map(((1,true,"nocase")->List(2)), ((2,true,"case0")->List(3,4,5)),
((2,false,"case1")->List(3)))
条件:
val map = Map(((1,true,"case0")->List(1,2,3)), ((2,true,"case0")->List(3,4,5)),
((1,true,"case1")->List(2,4,6)), ((2,false,"case1")->List(3)))
Map(((1,true,"nocase")->List(2)), ((2,true,"case0")->List(3,4,5)),
((2,false,"case1")->List(3)))
键。_1应与键匹配。_2应为真。您可以有条件地执行
groupBy
map.groupBy{case (key, value) => if (key._1 == 1) (key._1, key._2) else key }
.map{case (key, elements) => (key, elements.values.reduce(_ intersect _ ))}
在这段代码中,如果键的第一个元素不是1,您将使用整个键(3个元素)进行分组,否则它将仅按键的第一个和第二个元素进行分组
输出:
Map((2,true,case0) -> List(3, 4, 5), (2,false,case1) -> List(3), (1,true) -> List(2))
您可以有条件地执行
groupBy
map.groupBy{case (key, value) => if (key._1 == 1) (key._1, key._2) else key }
.map{case (key, elements) => (key, elements.values.reduce(_ intersect _ ))}
在这段代码中,如果键的第一个元素不是1,您将使用整个键(3个元素)进行分组,否则它将仅按键的第一个和第二个元素进行分组
输出:
Map((2,true,case0) -> List(3, 4, 5), (2,false,case1) -> List(3), (1,true) -> List(2))
这是路
map.groupBy(
e => (e._1._1, e._1._2) //group input by key._1 and key._2
).collect{
case e if (e._2.keys.size > 1)=> // if key have more cases(key._3) use "nocase"
(e._1._1, e._1._2, "nocase") -> //Tuple3(Int, Boolean, String)
e._2.values.reduce(_.intersect(_)) //List of common elements
case e => //we have only one key._3 so use as it is
(e._1._1, e._1._2, e._2.map(e=> e._1._3).mkString("")) ->
e._2.values.reduce(_.intersect(_))
}
输出
这是路
map.groupBy(
e => (e._1._1, e._1._2) //group input by key._1 and key._2
).collect{
case e if (e._2.keys.size > 1)=> // if key have more cases(key._3) use "nocase"
(e._1._1, e._1._2, "nocase") -> //Tuple3(Int, Boolean, String)
e._2.values.reduce(_.intersect(_)) //List of common elements
case e => //we have only one key._3 so use as it is
(e._1._1, e._1._2, e._2.map(e=> e._1._3).mkString("")) ->
e._2.values.reduce(_.intersect(_))
}
输出
你是说groupByKey吗?在代码片段中,我仍然看到groupBy被使用。我是说groupBy。对不起,你是说groupByKey吗?在代码片段中,我仍然看到groupBy被使用。我是说groupBy。对不起,谢谢你的回答。你能解释一下下面这行的意义吗?案例e=>(e。当只有一个键存在时,我们通过连接这一个键而不使用分隔符来获取字符串(如果没有,我们将获得一个
列表[string]
)。想知道我们是否可以不使用分隔符来实现相同的目的。_1。_1。因为使用u会降低可读性。@Srivignesh不可能使用
,因为我们对collect案例的操作不止一个,但是要自己学习,您可以使用案例中的ofcollect
删除这些内部调用并继续学习。谢谢您的回答。你能解释一下下面这行的意义吗?案例e=>(e。当只有一个键存在时,我们通过连接这一个键而不使用分隔符来获取字符串(如果没有,我们将获得一个列表[string]
)。想知道我们是否可以不使用分隔符来实现相同的目的。_1。_1。因为使用u会降低可读性。@Srivignesh不可能使用
,因为我们对collect案例的操作不止一个,但是要自己学习,您可以使用collect
的incase
删除这些内部调用并继续学习它们。