2015-08-14 3 views
3

У меня есть список val l=List(4,3,2,1), я пытаюсь сгенерировать список кортежей формата (4,3), (4,2) и так далее.scala: генерация кортежей из списка

Вот что я до сих пор:

for (i1<-0 to l.length-1;i2<-i1+1 to l.length-1) yield (l(i1),l(i2))

Выход: Vector((4,3), (4,2), (4,1), (3,2), (3,1), (2,1))

Два вопроса:

  1. Он генерирует Vector, не List. Как эти два разных?

  2. Это способ сделать это idiomatic scala? Я очень новичок в Scala, поэтому для меня важно, чтобы я учился правильно.

ответ

6

В первой части вопроса, то для понимания реализация определяет диапазоны 0 to l.length-1 и i1+1 to l.length-1 как IndexedSeq[Int], следовательно, дало типа признак IndexedSeq[(Int, Int)] реализуется конечным классом Vector.

На второй части, ваш подход справедлив, но необходимо учитывать следующее, где мы не используем индексированные ссылки на списки,

for (List(a,b,_*) <- xs.combinations(2).toList) yield (a,b) 

Обратите внимание, что

xs.combinations(2).toList 
List(List(4, 3), List(4, 2), List(4, 1), List(3, 2), List(3, 1), List(2, 1)) 

и так с List(a,b,_*) мы pattern-match и извлекать первые два элемента каждого вложенного списка (_* указывает на игнорирование возможных дополнительных элементов). Поскольку итерация над списком, для понимания выводится список дубликатов.

+0

Спасибо, есть ли причина, по которой вы используете List (a, b, _ *), а не только List (a, b)? – rivu

Смежные вопросы