无循环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")

在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")->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
案例的操作不止一个,但是要自己学习,您可以使用
案例中的
of
collect
删除这些内部调用并继续学习。谢谢您的回答。你能解释一下下面这行的意义吗?案例e=>(e。当只有一个键存在时,我们通过连接这一个键而不使用分隔符来获取字符串(如果没有,我们将获得一个
列表[string]
)。想知道我们是否可以不使用分隔符来实现相同的目的。_1。_1。因为使用u会降低可读性。@Srivignesh不可能使用
,因为我们对collect
案例的操作不止一个,但是要自己学习,您可以使用
collect
的in
case
删除这些内部调用并继续学习它们。