Scala - объединение нескольких списков в один, если путь один и тот же, вплоть до изменения пути. (удалить дубликаты подсписков в списке) - PullRequest
3 голосов
/ 01 июля 2019

У меня есть список объектов, которые содержат список объектов одного типа.Например,

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]

Требование: все объекты будут вложены в один список, а не в отдельные списки.

Это было трудно объяснить, поэтому я прошу прощения, если это трудно понять.

РЕДАКТИРОВАТЬ: В настоящее время я удаляю любые подпункты, которые не являются самыми длинными.Однако я не сохраняю желаемый результат, потому что не знаю, как проверить, является ли путь полностью уникальным от начала до конца.Если он не уникален от начала до конца и весь путь является подпуть другого пути, то я хочу удалить его.

1 Ответ

1 голос
/ 01 июля 2019

Предполагая, что пути представлены в виде кортежей

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")
)

вот моя попытка, которая зависит от нахождения всех индексов из 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))

Я восстанавливаю из и в кортежи , не зная арности вот так

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]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...