【问题标题】:How to convert list of list to simple list by removing duplicate values using scala?如何通过使用scala删除重复值将列表列表转换为简单列表?
【发布时间】:2014-10-20 06:00:21
【问题描述】:

我有以下列表 -

List(List(
List(((groupName,group1),(tagMember,["192.168.20.30","192.168.20.20","192.168.20.21"]))), 
List(((groupName,group1),(tagMember,["192.168.20.30"]))),
List(((groupName,group1),(tagMember,["192.168.20.30","192.168.20.20"])))))

我想把它转换成-

List((groupName, group1),(tagMember,["192.168.20.30","192.168.20.20","192.168.20.21"]))

我尝试使用 .flatten 但无法形成所需的输出。

如何使用 scala 获得上述输出??

【问题讨论】:

  • 你能把你的例子简化成一些我们可以复制到repl中的代码吗?也许使用更短的字符串?
  • 我使用 list.flatten 来删除扁平化列表,但不知道如何通过删除重复元素来合并列表
  • @Vishwas: ll.flatten.distinct
  • IP 地址是列表中唯一的变量部分,还是列表中可能有其他条目,例如 (groupName, group2)?
  • 这似乎不是一个有效的 Scala 代码。

标签: list scala collections


【解决方案1】:

我必须对您的输入进行一些更改以使其有效。

输入列表:

   val ll = List(List(
      List((("groupName","group1"),("tagMember", List("192.168.20.30","192.168.20.20","192.168.20.21")))),
      List((("groupName","group1"),("tagMember",List("192.168.20.30")))),
      List((("groupName","group1"),("tagMember",List("192.168.20.30","192.168.20.20"))))
    ))    

如果组和 tagMember 在列表中的所有元素中都相同,则下面的代码有效

  def getUniqueIpsConstantGroupTagMember(inputList:  List[List[List[((String, String), (String, List[String]))]]]) = {
      // List[((String, String), (String, List[String]))]
      val flattenedList  = ll.flatten.flatten

      if (flattenedList.size > 0) {
         val group = flattenedList(0)._1
         val tagMember = flattenedList(0)._2._1
         val ips = flattenedList flatMap (_._2._2)

         ((group), (tagMember, ips.distinct))
      } 
         else List()
  }

  println(getUniqueIpsConstantGroupTagMember(ll))

输出:

((groupName,group1),(tagMember,List(192.168.20.30, 192.168.20.20, 192.168.20.21)))

现在,假设您可以有不同的组名。

示例输入:

  val listWithVariableGroups = List(List(
      List((("groupName","group1"),("tagMember",List("192.168.20.30","192.168.20.20","192.168.20.21")))),
      List((("groupName","group1"),("tagMember",List("192.168.20.30")))),
      List((("groupName","group1"),("tagMember",List("192.168.20.30","192.168.20.20")))),
      List((("groupName","group2"),("tagMember",List("192.168.20.30","192.168.20.10"))))   
    ))

以下代码应该可以工作。

  def getUniqueIpsForMultipleGroups(inputList:  List[List[List[((String, String), (String, List[String]))]]]) = {
    val flattenedList = inputList.flatten.flatten

    // Map[(String, String),List[(String, List[String])]]
    val groupedByGroupNameId = flattenedList.groupBy(p => p._1) map {
      case (key, value) => (key, ("tagMember", extractUniqueTagIps(value)))
    }
    groupedByGroupNameId
  }

  def extractUniqueTagIps(list: List[((String, String), (String, List[String]))]) = {
    val ips = list flatMap (_._2._2)
    ips.distinct
  }

  getUniqueIpsForMultipleGroups(listWithVariableGroups).foreach(println)

输出:

((groupName,group1),(tagMember,List(192.168.20.30, 192.168.20.20, 192.168.20.21)))
((groupName,group2),(tagMember,List(192.168.20.30, 192.168.20.10)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2022-07-20
    • 1970-01-01
    • 2014-09-27
    • 2018-08-08
    • 1970-01-01
    • 2019-02-24
    • 2012-09-03
    相关资源
    最近更新 更多