Tại sao? Và cách tốt nhất để di chuyển con trỏ vòng lặp tới vị trí đầu tiên là gì?Tại sao trình vòng lặp không có bất kỳ phương pháp đặt lại nào?
Trả lời
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.
Cách tốt nhất là tạo một cái mới!
Cách chính xác mà bạn đã tạo ra trước đó một: Iterator
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.
Đâ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()
và 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.
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
... 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
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
- 1. Vòng lặp for mà không có bất kỳ {}
- 2. Python có bất kỳ vòng lặp tương đương (không foreach)
- 3. Vòng lặp với StateT: Tại sao vòng lặp này không lặp lại
- 4. Tại sao có sự khác biệt về tốc độ giữa vòng lặp của Clojure và phương pháp lặp lại
- 5. Tại sao không .htaccess có bất kỳ hiệu ứng nào?
- 6. Tại sao có một trình lặp phương thức() trên java.util.Collection
- 7. Trình lặp Java và cho mỗi vòng lặp. bất kỳ cách nào để truy cập trình lặp cơ bản?
- 8. Tại sao vòng lặp 'cho (;;)' này lại là?
- 9. Tại sao bất kỳ chương trình Java/Clojure nào bị chậm lại khi chạy từ Leiningen?
- 10. Tại sao có thể lặp lại một chuỗi?
- 11. Trình lặp lặp tích hợp cho PriorityQueue của java không đi qua cấu trúc dữ liệu theo bất kỳ thứ tự cụ thể nào. Tại sao?
- 12. Tại sao tôi không thể lặp lại vòng lặp 'for' cho csv.Reader? (Python)
- 13. Bất kỳ cách nào để làm cho chu kỳ jQuery không lặp lại khi đạt đến kết thúc hoặc đầu?
- 14. Tại sao "Phương pháp hoàn thiện không nên tham chiếu đến bất kỳ đối tượng nào khác"?
- 15. Tại sao tôi không thể đặt thuộc tính của biến lặp trong vòng lặp foreach?
- 16. Tại sao Java không cho phép foreach trên các trình vòng lặp (chỉ trên các vòng lặp)?
- 17. Tại sao vòng lặp này không bao giờ kết thúc?
- 18. Tại sao XInclude không được bất kỳ trình duyệt nào hỗ trợ?
- 19. Phương pháp chính thuộc về bất kỳ lớp học nào?
- 20. lặp lại một vòng lặp cho vòng lặp
- 21. Tại sao vòng lặp foreach lặp lại quá 10.000 lần bộ nhớ?
- 22. trả lại cho vòng lặp hoặc vòng lặp ngoài
- 23. Java String ReplaceAll phương pháp đưa ra lỗi lặp lại bất hợp pháp?
- 24. Java Vòng lên Bất kỳ Số nào
- 25. Có bất kỳ trình đánh dấu cú pháp Python nào cho Visual Studio 2010 không?
- 26. vòng lặp lập lịch trình vòng lặp java
- 27. Django, mẫu, vòng lặp và chu kỳ
- 28. Trong một vòng lặp, thực hiện bất kỳ thao tác nào trong điều kiện cuối có được đánh giá trong mọi lần lặp lại không?
- 29. có vòng lặp và vòng lặp trong con rối không?
- 30. Các phiên PHP có đặt bất kỳ cookie nào không?
(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
@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
@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