我有一个对象列表,其中包含相同类型的对象列表。例如。
List[CustomObject(objName, List[CustomObject])]目前,我有一个将这些CustomObject合并到一个列表中的程序。然而,它们包含了所有可能的“列表路径”。如果某些路径已经在较长的路径中被引用,我希望能够删除它们。
List(CustomObject("obj-1", List(CustomObject("obj-2", List(CustomObject("obj-3", List())))))程序输出所有可能的路径。例如,它将在同一个列表中输出。
[obj-1 -> obj-2 ->obj-3,
obj-1 -> obj-2]我希望能够删除obj-1 -> obj2,因为路径已经显示出来了。但是,如果在这条道路上有不同的孩子,我愿意保留这条路。例如,下面是想要的输出,我宁愿保留路径。基本上,我希望这条路是独一无二的
[obj-1 -> obj-2-A -> obj -3,
obj-1 -> obj-2-B -> obj-4]需求:所有对象都将嵌套在一个列表中,而不是单独的列表中。
这一点很难解释,所以如果很难理解的话,我很抱歉。
编辑:我目前正在删除任何不是最长的子项目。但是,我没有保留所需的输出,因为我不知道如何从开始到结束检查路径是否是完全唯一的。如果从开始到结束它不是唯一的,并且整个路径是另一条路径的子路径,那么我想删除它。
发布于 2019-07-01 18:36:58
假设路径表示为元组
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谓词
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)
}哪种输出
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的情况下重建了它
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]
}https://stackoverflow.com/questions/56838524
复制相似问题