Как сравнить подсписки в List [List [Double]] - PullRequest
1 голос
/ 17 января 2020

У меня есть List[List[Double]]

Игнорируя последний элемент каждого списка во внешнем списке, я хочу сравнить внутренние списки, т.е. у нас есть

List(
  List(0.1,0.5,0.3,0),
  List(2.3,0.1,0.4,1),
  List(0.1,0.5,0.3,1)
)

Я хочу отдельный список игнорирование последнего элемента, т.е.

List(
  List(0.1,0.5,0.3,0),
  List(2.3,0.1,0.4,1)
)

Здесь первый и последний списки аналогичны, игнорируя последние элементы. пожалуйста, предоставьте мне некоторую подсказку. Поскольку я очень плохо знаком с scala.

Ответы [ 2 ]

7 голосов
/ 17 января 2020

Изучите стандартную библиотеку. Удивительно, что там можно найти.

List(List(0.1,0.5,0.3,0),List(2.3,0.1,0.4,1),List(0.1,0.5,0.3,1)).distinctBy(_.init)
//res0: List[List[Double]] = List(List(0.1, 0.5, 0.3, 0.0), List(2.3, 0.1, 0.4, 1.0))
2 голосов
/ 17 января 2020

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