2009-06-19 34 views
7

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?

+0

Đ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

+0

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. –

Trả lời

31

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.)

+0

+1 cho Iterables.cycle – coobird

+0

Đây là một phương pháp thực sự tuyệt vời. –

1

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 đó.

+0

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 –

0

Đâ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(); 
+1

Điều đó dường như không sao –

5
Iterator it = mylist.iterator(); 
while (it.hasNext()) 
{ 
    MyType t = (MyType)it.next(); 

    // do something 

    if (!it.hasNext()) 
    it = mylist.iterator(); 
} 
+0

Đây không phải là một vòng lặp vô hạn? –

+0

Không, .text tiến hành trình lặp. – AlexC

+0

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 –

0

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.

0

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()); 
} 
} 
0

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.

1

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ự.

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