2013-03-06 41 views
31

Tôi đang tìm kiếm một cách thanh lịch để lấy một lát danh sách từ phần tử n trở đi mà không cần phải chỉ định độ dài của danh sách. Cho phép nói rằng chúng ta có một chuỗi multiline mà tôi chia thành dòng và sau đó muốn có được một danh sách của tất cả các dòng từ dòng 3 trở đi:Trong Scala, làm thế nào để có được một lát của một danh sách từ phần tử thứ n đến cuối danh sách mà không biết chiều dài?

string.split("\n").slice(3,X)  // But I don't know what X is... 

Những gì tôi đang thực sự quan tâm ở đây là liệu có một cách để giữ của một tham chiếu của danh sách được trả về bởi các cuộc gọi split để chiều dài của nó có thể được thay thế thành X tại thời điểm cuộc gọi slice, loại như một ưa thích _ (trong trường hợp này nó sẽ đọc là slice(3,_.length))? Trong python ta không cần phải xác định phần tử cuối cùng của slice.

Tất nhiên tôi có thể giải quyết điều này bằng cách sử dụng biến tạm thời sau khi chia tách hoặc tạo hàm trợ giúp với cú pháp đẹp, nhưng tôi chỉ tò mò.

Trả lời

71

Chỉ cần thả n phần tử đầu tiên bạn không cần:

List(1,2,3,4).drop(2) 
res0: List[Int] = List(3, 4) 

hoặc trong trường hợp của bạn:

string.split("\n").drop(2) 

Ngoài ra còn có cặp phương pháp .take(n) rằng làm điều ngược lại, bạn có thể nghĩ nó là .slice(0,n).

Trong trường hợp bạn cần cả hai phần, sử dụng .splitAt:

val (left, right) = List(1,2,3,4).splitAt(2) 
left: List[Int] = List(1, 2) 
right: List[Int] = List(3, 4) 
4

nhận được 2 yếu tố cuối cùng:

List(1,2,3,4,5).reverseIterator.take(2)

+0

Đó có phải là cách duy nhất để có được 2 cuối cùng w/o biết # yếu tố? – Blankman

+0

Danh sách (1,2,3,4,5) .reverse.take (2) .xác nhận để có được thứ tự ban đầu – ChuckCottrill

63

Câu trả lời đúng là takeRight(n):

"communism is sharing => resource saver".takeRight(3) 
               //> res0: String = ver 
+1

Tôi nghĩ rằng điều này nên được chấp nhận câu trả lời. Tại chỗ trên! – WoodChopper

+6

Xem xét câu hỏi OP này không thực hiện điều đúng vì nó bắt đầu từ phần tử n. 'Danh sách (1,2,3,4) .takeRight (3)' tạo 'Danh sách [Int] = Danh sách (2,3,4)' –

5

Bạn có thể sử dụng phương pháp danh sách của scala 'takeRigh t', này sẽ không ném ngoại lệ khi chiều dài Danh sách là không đủ, Như thế này:

val t = List(1,2,3,4,5); 
t.takeRight(3); 
res1: List[Int] = List(3,4,5) 

Nếu danh sách không phải là lâu hơn bạn muốn lấy, điều này sẽ không ném ngoại lệ:

val t = List(4,5); 
t.takeRight(3); 
res1: List[Int] = List(4,5) 
Các vấn đề liên quan