2010-08-18 25 views
14

Tôi có một số tệp lớn mà tôi muốn xử lý tất cả trừ dòng cuối cùng trong mỗi tệp. Nếu các tập tin còn nhỏ, tôi chỉ có thể chuyển đổi sang một TraversableLike và sử dụng "init" phương pháp, ví dụ .:tất cả trừ mục cuối cùng từ Bộ lặp Iterator (a.k.a. Iterator.init)

lines.toList.init 

Nhưng các tập tin lớn vì vậy tôi cần phải giữ cho mọi thứ như một iterator. Có một cách đơn giản để có được một cái gì đó như "init" trên một Iterator? Tôi đang xem xét những điều sau đây, nhưng tôi không tin tưởng nó sẽ luôn luôn làm việc:

lines.takeWhile(_ => lines.hasNext) 
+2

'lines' là gì? –

Trả lời

14

Bạn đang dựa vào takeWhile grabbing dòng tiếp theo đầu tiên, và sau đó kiểm tra để xem nếu có dòng khác. Nó hoạt động theo cách này trong trình lặp mặc định. Và đối với bất kỳ trình lặp nào cụ thể, tôi hy vọng rằng nếu nó hoạt động, nó sẽ luôn hoạt động.

Nếu nó không thành công, bạn sẽ cần phải lưu lại kết quả. Bạn có thể làm iterator của riêng bạn mà thực hiện điều này, hoặc, một cách dễ dàng hơn (nếu điều này không phải là khẩn trương thực hiện quan trọng code):

lines.sliding(2).map(_.head) 

thử nghiệm này như sau:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList 

Bạn không phải dựa trên takeWhile hoặc bất kỳ phương pháp nào khác hoạt động theo bất kỳ cách cụ thể nào; nếu sliding không bị hỏng, nó sẽ có hành vi ở trên.

+0

Đẹp! Tôi đã phải nhìn chằm chằm vào nó một chút để xem lý do tại sao nó hoạt động, nhưng nó dường như ít hackish hơn giải pháp của tôi. =) – Steve

3

Nếu bạn muốn bỏ qua 2 dòng đầu tiên, và thả người cuối cùng 4 bạn có thể lặp lại với

List(1, 2, 3).toIterable.drop(1).dropRight(1) 

Nếu bạn đã có tài IterableLike

il.drop(1).dropRight(1) 
+0

'Danh sách (1, 2, 3) .iterator.dropRight (1)' yields 'error: giá trị dropRight không phải là thành viên của Iterator [Int]'. Vì vậy, theo như tôi có thể nói, giống như 'init', không có' dropRight' trên Iterator. – Steve

Các vấn đề liên quan