Существует ли операция списка scala, которая создает кортежи из списков?

#list #scala #functional-programming #tuples

#Список #scala #функциональное программирование #кортежи

Вопрос:

Я пытаюсь обработать триплеты в списке. В обязательном порядке я мог бы сделать это:

 for(i = 1; i < list.length-1; i  )
{
   process( list[i-1], list[i], list[i 1] )
}
  

Есть ли функция списка в Scala (или как бы ее написать), которая может делать что-то подобное:

 val data = [1,2,3,4,5,6,7,8,9,10]
val tuples = data.some_magic_func
tuples would be[(1,2,3), (2,3,4), (3,4,5), (4,5,6) ... ]
  

Спасибо!

Ответ №1:

Решение Пабло не совсем правильное, вам все равно нужно преобразовать список списков в список кортежей:

 val data = List(1,2,3,4,5,6,7,8,9,10)
val tuples = data.sliding(3).toList.collect{ case List(x,y,z) => (x,y,z) }
//--> tuples: List[(Int, Int, Int)] = List((1,2,3), (2,3,4), (3,4,5), ...
  

Комментарии:

1. Я заметил это и сумел обойти это. Мне нравится собирать, хотя.

Ответ №2:

Я знаю, что вы получили ответ, который хотели, но технически правильный ответ — нет. Не существует общего метода, который принимает список и возвращает кортежи переменной кратности, потому что в настоящее время нет способа представить сигнатуру этого типа в Scala.

Комментарии:

1. спасибо за разъяснение. Для моей цели решение Пабло отлично подходит для меня, но всегда приятно получить больше информации.

Ответ №3:

 val data = List(1,2,3,4,5,6,7,8,9,10)
val tuples = data.sliding(3).toList
// tuples would be List(List(1,2,3), List(2,3,4), List(3,4,5), List(4,5,6) ... )
  

Комментарии:

1. это именно то, что я искал. Будет помечено как «ответ», как только это позволит SO.

2. @Пабло Фернандес: Это неверно, результат tuples: List[List[Int]] = List(List(1, 2, 3), List(2, 3, 4), ...

3. Как уже отмечал Ландей, этот ответ неверен, он выдает не список кортежей, а список списков. Вопрос явно о списке кортежей! Решение Landei является правильным.