首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala --如果路径相同,则将多个列表合并到一个列表中,直到路径更改。(删除列表中的重复子列表)

Scala --如果路径相同,则将多个列表合并到一个列表中,直到路径更改。(删除列表中的重复子列表)
EN

Stack Overflow用户
提问于 2019-07-01 15:40:36
回答 1查看 98关注 0票数 3

我有一个对象列表,其中包含相同类型的对象列表。例如。

代码语言:javascript
复制
List[CustomObject(objName, List[CustomObject])]

目前,我有一个将这些CustomObject合并到一个列表中的程序。然而,它们包含了所有可能的“列表路径”。如果某些路径已经在较长的路径中被引用,我希望能够删除它们。

代码语言:javascript
复制
List(CustomObject("obj-1", List(CustomObject("obj-2", List(CustomObject("obj-3", List())))))

程序输出所有可能的路径。例如,它将在同一个列表中输出。

代码语言:javascript
复制
[obj-1 -> obj-2 ->obj-3,
 obj-1 -> obj-2]

我希望能够删除obj-1 -> obj2,因为路径已经显示出来了。但是,如果在这条道路上有不同的孩子,我愿意保留这条路。例如,下面是想要的输出,我宁愿保留路径。基本上,我希望这条路是独一无二的

代码语言:javascript
复制
[obj-1 -> obj-2-A -> obj -3,
 obj-1 -> obj-2-B -> obj-4]

需求:所有对象都将嵌套在一个列表中,而不是单独的列表中。

这一点很难解释,所以如果很难理解的话,我很抱歉。

编辑:我目前正在删除任何不是最长的子项目。但是,我没有保留所需的输出,因为我不知道如何从开始到结束检查路径是否是完全唯一的。如果从开始到结束它不是唯一的,并且整个路径是另一条路径的子路径,那么我想删除它。

EN

回答 1

Stack Overflow用户

发布于 2019-07-01 18:36:58

假设路径表示为元组

代码语言:javascript
复制
val l1 =  List(
  ("obj-1", "obj-2", "obj-3"),
  ("obj-1", "obj-2")
)

val l2 =  List(
  ("obj-1", "obj-2", "obj-3"),
  ("obj-1", "obj-2", "obj-4")
)

下面是我的尝试,它依赖于finding all indices of startsWith谓词

代码语言:javascript
复制
def removeDuplicateSubpaths(paths: List[Product]): List[Product] = {
  val l = fromTuple(paths)
  l.map { path =>
    l
      .zipWithIndex
      .filter(_._1.startsWith(path))
      .map(_._2)
  }
    .zip(l)
    .filter(_._1.size == 1)
    .map(_._2)
    .map(toTuple)
}

哪种输出

代码语言:javascript
复制
removeDuplicateSubpaths(l1) // List((obj-1,obj-2,obj-3))
removeDuplicateSubpaths(l2) // List((obj-1,obj-2,obj-3), (obj-1,obj-2,obj-4))

我在不知道from and to tuples的情况下重建了它

代码语言:javascript
复制
def fromTuple[T](paths: List[Product]): List[List[T]] =
  paths.map(_.productIterator.toList.asInstanceOf[List[T]])

def toTuple[A](as: List[A]): Product = {
  val tupleClass = Class.forName("scala.Tuple" + as.size)
  tupleClass.getConstructors.apply(0).newInstance(as:_*).asInstanceOf[Product]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56838524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档