2011-10-07 30 views

Trả lời

32

Tại sao?

Vì nếu bạn buộc trình lặp có phương pháp đặt lại mỗi trình lặp lại phải có phương pháp đặt lại. Điều đó mang lại cho mỗi nhà văn lặp lại công việc thêm. Cộng với một số trình vòng lặp thực sự khó (hoặc thực sự đắt tiền) để đặt lại và bạn sẽ không muốn người dùng gọi lại trên thiết bị đó. Các bộ lặp qua các tệp hoặc luồng là các ví dụ hay.

cách tốt nhất để di chuyển con trỏ của mục trình vòng lặp đến vị trí đầu tiên là gì?

Tạo trình lặp mới. Nó hiếm khi đắt hơn thiết lập lại.

+6

(Trừ thực tế là có phương thức 'remove', * không * thực sự thực sự cung cấp cho tất cả các vòng lặp" công việc phụ ", vì thao tác là tùy chọn.) – aioobe

+0

@aioobe Có một số trường hợp xóa đối tượng hiện tại qua iterator làm cho cuộc sống thực sự dễ dàng cho các nhà phát triển. Có rất ít trường hợp điều này là đúng cho thiết lập lại (vì bạn hầu như luôn có thể tạo một trình lặp mới). – DJClayworth

+1

@DJClayworth "Điều đó mang lại cho mọi tác giả thêm công việc của nhà biên tập." Đó không phải là một phản ứng hợp lý. Người triển khai thư viện cần phải nỗ lực thêm một chút, nhưng phần thưởng là nhiều người dùng thư viện sẽ nhận được lợi ích. – stackoverflowuser2010

3

Cách tốt nhất là tạo một cái mới!

+1

Cách chính xác mà bạn đã tạo ra trước đó một: Iterator iterator = iteratable.iterator(); –

6

Sau khi đọc luồng, bạn không thể đọc lại mà không cần mở lại nguồn. Đó là cách các luồng và trình vòng lặp hoạt động.

3

Đây là xu hướng chung được áp dụng trong JCF - giữ giao diện tối giản, trừ khi điều đó làm cho một số tính năng cực kỳ khó làm việc. Đây là lý do tại sao bạn không có giao diện riêng biệt cho ngữ nghĩa như bộ sưu tập không thay đổi, bộ sưu tập có kích thước cố định ..

Vì lý do này, không cung cấp điều này một cách an toàn một mục từ bộ sưu tập trong khi lặp qua bộ sưu tập - không có gì làm cho việc cung cấp reset() trở nên hấp dẫn.

Một lần nữa, tại sao có một riêng biệt ListIterator() (phương pháp cung cấp như previous()previousIndex()) - Với một giao diện List, các chức năng chính trong khi nó đang được sử dụng là khả năng bố trí các yếu tố WRT một chỉ số, và để có thể truy cập chúng với một thứ tự chỉ mục, cho dù thứ tự cố định hoặc ngẫu nhiên. Đây không phải là trường hợp với các bộ sưu tập khác. Không cung cấp giao diện này cho một List sẽ làm cho nó rất khó khăn nếu không phải không thể làm việc trơn tru với một danh sách.

+0

Có một vài điều có thể được thực hiện với hầu hết bất kỳ 'Iteratable' và' Iterator', có thể được đưa vào giao diện một cách hữu ích nhưng không. Các phương thức lặp hữu ích sẽ bao gồm 'skip' [tương đương với N các cuộc gọi di chuyển liên tiếp, mặc dù nhiều trình vòng lặp có thể thực hiện nó trong thời gian O (1)] và' copyLocation' [mà sẽ trả về một trình lặp được dự kiến ​​sẽ mang lại các mục giống như bản gốc ]. Bất kỳ iterator nào cũng có thể thực hiện một phương thức 'skip', và bất kỳ iterator hữu hạn không lớn nào có thể thực thi' copyLocation' bằng cách liệt kê chính nó vào một mảng, và sau đó có cả nó và bản sao ... – supercat

+0

... trả về các mục từ mảng đó. Mã máy khách có thể thực hiện một trong hai hoạt động, nhưng nếu một trình lặp có kiến ​​thức đặc biệt về các hoạt động bên trong của nó mà mã khách hàng thiếu, nó có thể sử dụng kiến ​​thức đó để cung cấp các cải tiến tốc độ nhiều bậc. – supercat

2

Mẹo: tạo biến lặp của bạn làm hàm thay vào đó, sau đó bạn có thể sử dụng nó nhiều lần tùy thích. Điều này chỉ hoạt động nếu logic cơ bản có thể lặp lại.

Ví dụ trong Scala (Java tương tự nhưng tôi không có một REPL Java tiện dụng)

def i = (1 to 100) iterator // i is our iterator 
i.grouped(50) foreach println // prints two groups 
i.grouped(50) foreach println // prints same two groups again 
Các vấn đề liên quan