Tôi đã tự hỏi điều gì là cách dễ nhất để lặp lại trong một tập hợp vô thời hạn, tức là khi nó đạt đến điểm kết thúc, nó gọi đối tượng đầu tiên là. Tôi giả định rằng đây không phải là một hàm đã được xác định trước trong Java, vì vậy chỉ cần tìm cách dễ nhất để thực hiện điều này trong Java.Làm cách nào để tạo một trình lặp không bao giờ kết thúc?
Trả lời
Có một phương pháp tuyệt vời trong Google Collections thư viện mà thực hiện điều này:
Set<String> names = ...;
Iterable<String> infinite = Iterables.cycle(names);
(tôi không thể giới thiệu các thư viện Google Bộ sưu tập Tôi rất thiên vị khi tôi làm việc cho Google, nhưng tôi nghĩ rằng khá nhiều mỗi người viết Google viết Java sẽ cho bạn biết các bộ sưu tập hữu ích như thế nào.)
+1 cho Iterables.cycle – coobird
Đây là một phương pháp thực sự tuyệt vời. –
Nếu bạn đang tạo trình vòng lặp, trong phương pháp tiếp theo, bạn có thể có điều kiện nếu kiểm tra xem có đối tượng khác trong danh sách hay không. Nếu có, sau đó bạn trả lại đối tượng đó, nếu không có thì bạn quay trở lại phần đầu của danh sách và trả về đối tượng đó.
Tôi hiểu bạn đã đăng câu trả lời của mình trước tôi, nhưng như đã thấy trong câu trả lời của tôi đó là những gì tôi đang làm ngay bây giờ, tôi đã tự hỏi liệu có cách nào tốt hơn là tạo một đối tượng Iterator mới mỗi khi tôi kết thúc –
Đây là những gì tôi có thể nghĩ ra ...
iterator = set.getIterator
//other code
if (iterator.hasNext())
//do code here
else
iterator = set.getIterator();
Điều đó dường như không sao –
Iterator it = mylist.iterator();
while (it.hasNext())
{
MyType t = (MyType)it.next();
// do something
if (!it.hasNext())
it = mylist.iterator();
}
Đây không phải là một vòng lặp vô hạn? –
Không, .text tiến hành trình lặp. – AlexC
Ya, nhưng ở phía dưới, bạn thay thế 'nó' bằng một trình lặp mới nếu' nó' bị cạn kiệt, có nghĩa là bạn sẽ không bao giờ thoát ra khỏi vòng lặp ... mà tôi đoán là toàn bộ vấn đề, nhưng tôi đã hiểu sai câu hỏi và nghĩ rằng OP đã hỏi làm thế nào để * tạo ra * một vòng lặp lặp lại vô hạn, điều này không làm –
Tôi nghĩ rằng những gì bạn muốn không bao giờ giúp Bạn có thể làm bất cứ điều gì với iterator của bạn đó là dễ dàng nhưng bạn phải cẩn thận với bất kỳ điều mới bạn thêm im không được sử dụng với phong cách này, nhưng đây là những gì bạn muốn mặc dù:
nếu (! It.hasNext()) { khi (It.hasPrevious()) { It = It.Previous(); } } else { It = It.Next(); }
Cách này là không có gì nếu bạn thực sự quan tâm, thay vào đó bạn nên tạo con trỏ tiếp theo của người cuối cùng đến người đầu tiên luôn khi đẩy danh sách mới.
Làm thế nào?
List<String> list = // ArraysList
Interator<String> it = null;
while(true) {
it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
Nếu bạn không muốn sử dụng ổi nhưng vẫn muốn có một giải pháp tái sử dụng:
public static class CyclicIterator<E, C extends Collection<E>> implements Iterator<E> {
final private C mElements;
private Iterator<E> mIterator;
public CyclicIterator(C elements) {
mElements = elements;
mIterator = elements.iterator();
}
@Override
public boolean hasNext() {
if (! mIterator.hasNext()) {
mIterator = mElements.iterator();
}
return mIterator.hasNext();
}
@Override
public E next() {
if (! mIterator.hasNext()) {
mIterator = mElements.iterator();
}
return mIterator.next();
}
}
Lưu ý: đây không hỗ trợ phương pháp xóa() nhưng nó có thể dễ dàng được thêm nếu cần thiết . Ngoài ra nó không phải là chủ đề an toàn.
Hãy thử EndlessIterator
từ Cactoos:
Iterator<String> names = new EndlessIterator<>("John");
Nó sẽ luôn luôn trả "John"
và sẽ không bao giờ kết thúc.
Ngoài ra, hãy kiểm tra EndlessIterable
, triển khai Iterable
và thực hiện tương tự.
- 1. Tại sao vòng lặp này không bao giờ kết thúc?
- 2. Sàn không bao giờ kết thúc trong cảnh BA.JS
- 3. Cài đặt gói Sitecore không bao giờ kết thúc
- 4. Tôi làm cách nào để tạo một trình bao bọc?
- 5. netbeans Cunit kiểm tra trường hợp không bao giờ kết thúc
- 6. reindex Danh mục URL Viết lại trong Magento không bao giờ kết thúc
- 7. Tạo và kết thúc chuỗi trong Windows bao lâu?
- 8. Làm cách nào để viết một trình bao bọc lặp kết hợp các nhóm các giá trị tuần tự từ trình lặp cơ bản?
- 9. Làm thế nào tôi có thể kết thúc ncurses mà không kết thúc chương trình C++?
- 10. Node.js & Redis; Chờ đợi một vòng lặp để kết thúc
- 11. Điều kiện kết thúc vòng lặp
- 12. s3 không bao giờ kết thúc yêu cầu âm thanh đang chờ xử lý
- 13. Làm cách nào để tạo trình bao bọc/proxy XMLHttpRequest?
- 14. Tại sao WebResponse không bao giờ kết thúc khi đọc luồng twitter firehose?
- 15. Xử lý đa xử lý Python> = 125 danh sách không bao giờ kết thúc
- 16. python: làm thế nào để chấm dứt một luồng khi chương trình chính kết thúc
- 17. Làm cách nào để lặp qua các dòng trong một tệp bên ngoài có trình bao?
- 18. Kết thúc vòng lặp vô hạn
- 19. Làm thế nào để chờ đợi cho một quá trình để kết thúc C++
- 20. Truy vấn Javascript WebSQL trong vòng lặp. Làm thế nào để biết khi nào kết thúc?
- 21. 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?
- 22. NSPredicate: làm thế nào để KHÔNG kết thúc?
- 23. Đang đợi Bộ hẹn giờ kết thúc bằng Java
- 24. Làm cách nào để chuyển đổi một mảng byte có ký tự kết thúc null thành một chuỗi trong Java?
- 25. Làm thế nào để chờ quá trình kết thúc bằng IO.popen?
- 26. Có cách nào để gọi một hàm ngay trước khi ứng dụng PyQt kết thúc không?
- 27. Làm cách nào để tạo một vòng lặp trong JavaScript?
- 28. Làm cách nào để kết thúc chương trình C++ sau khi bị lỗi?
- 29. Làm cách nào để tạo các tập lệnh tự động xóa khi kết thúc quá trình thực thi?
- 30. VBScript - Làm thế nào để làm cho chương trình đợi cho đến khi quá trình kết thúc?
Điều gì có thể là yêu cầu cho điều này. Nếu bạn chỉ muốn lặp lại mãi mãi một số yếu tố thì tại sao lại sử dụng Iterator? – Khangharoth
Nếu tôi chỉ sử dụng trình vòng lặp để truy cập các đối tượng thông qua một vòng lặp while thì sẽ không có điểm, nhưng tôi không nên sử dụng một trình vòng lặp vì nó phù hợp nhất với những gì tôi muốn làm. –