Подтвердить что ты не робот

В 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 не нужно указывать последний элемент среза.

Конечно, я мог бы решить это, используя временную переменную после разделения, или создав вспомогательную функцию с хорошим синтаксисом, но мне просто интересно.

4b9b3361

Ответ 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)