Если вы находитесь на Scala 2.13
+, пожалуйста, посмотрите решение @ jwvh, в противном случае ...
Вы можете просмотреть список через foldLeft
, чтобы собрать новый список внутренних списков, проверив против Set
списков с различными init
:
val list = List(List(0.1, 0.5, 0.3, 0.0), List(2.3, 0.1, 0.4, 1.0), List(0.1, 0.5, 0.3, 1.0))
list.foldLeft((List[List[Double]](), Set[List[Double]]())){ case ((ls, s), l) =>
val lInit = l.init
if (s.contains(lInit)) (ls, s) else (l :: ls, s + lInit)
}._1.reverse
// res1: List[List[Double]] = List(List(0.1, 0.5, 0.3, 0.0), List(2.3, 0.1, 0.4, 1.0))
В случае, если порядок результирующих внутренних списков не важен, альтернативой является группировка списка по внутреннему списку init
, за которым следует извлечение первого внутреннего списка из сгруппированной карты values
:
list.groupBy(_.init).map(_._2.head)
// res2: List[List[Double]] = List(List(2.3, 0.1, 0.4, 1.0), List(0.1, 0.5, 0.3, 0.0))