#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 является правильным.