В Scala, как получить фрагмент списка из n-го элемента в конец списка, не зная длины?
Я ищу элегантный способ получить фрагмент списка из элемента n и далее, не указывая длину списка. Допустим, у нас есть многострочная строка, которую я разделил на строки, а затем хочу получить список всех строк из строки 3 и далее:
string.split("\n").slice(3,X) // But I don't know what X is...
Мне действительно интересно узнать, есть ли способ получить ссылку списка, возвращаемого вызовом split
, чтобы его длина могла быть заменена на X
во время slice
call, вроде как fancy _
(в этом случае он будет читать как slice(3,_.length)
)? В python не нужно указывать последний элемент среза.
Конечно, я мог бы решить это, используя временную переменную после разделения, или создав вспомогательную функцию с хорошим синтаксисом, но мне просто интересно.
Ответы
Ответ 1
Просто отбросьте первые n элементов, которые вам не нужны:
List(1,2,3,4).drop(2)
res0: List[Int] = List(3, 4)
или в вашем случае:
string.split("\n").drop(2)
Существует также парный метод .take(n)
, который делает противоположное, вы можете думать о нем как .slice(0,n)
.
Если вам нужны обе части, используйте .splitAt
:
val (left, right) = List(1,2,3,4).splitAt(2)
left: List[Int] = List(1, 2)
right: List[Int] = List(3, 4)
Ответ 2
Правильный ответ takeRight(n)
:
"communism is sharing => resource saver".takeRight(3)
//> res0: String = ver
Ответ 3
получить последние 2 элемента:
List(1,2,3,4,5).reverseIterator.take(2)
Ответ 4
Вы можете использовать метод списка scala 'takeRight', это не будет генерировать исключение, когда длина списка не будет достаточной, например:
val t = List(1,2,3,4,5);
t.takeRight(3);
res1: List[Int] = List(3,4,5)
Если список не длиннее, чем вы хотите, это не будет выбрасывать исключение:
val t = List(4,5);
t.takeRight(3);
res1: List[Int] = List(4,5)