2010-07-25 63 views
76

Tôi đang sử dụng Iterator để lặp qua bộ sưu tập và tôi muốn lấy chỉ mục của phần tử hiện tại.Làm thế nào để có được chỉ số vòng lặp hiện tại khi sử dụng Iterator?

Tôi có thể làm như thế nào?

+0

thể trùng lặp của [Có cách nào để truy cập vào một lặp toa trong Java for-each vòng lặp?] (Http://stackoverflow.com/questions/477550/is-there-a-way-to-access-an-iteration-counter-in-javas-cho-mỗi-loop) – finnw

+1

@finnw Tôi không nghĩ rằng chúng trùng lặp. Câu hỏi này là yêu cầu sử dụng Iterator, người kia đang sử dụng vòng lặp for-each. Cả hai câu hỏi đều được giải quyết bằng cách tiếp cận tương tự, vì vậy các câu trả lời trùng lặp không phải là câu hỏi. – Robert

Trả lời

70

Sử dụng biến của riêng bạn và tăng biến đó trong vòng lặp.

+4

Nhưng cũng thấy gợi ý @ mateusz-dymczyk về 'it.nextIndex()'. Hữu ích khi bộ sưu tập là một Danh sách. – noamtm

2

Sử dụng int và tăng nó trong vòng lặp của bạn.

9

Loại bộ sưu tập nào? Nếu đó là việc triển khai giao diện Danh sách thì bạn chỉ có thể sử dụng it.nextIndex() - 1.

4

Sử dụng ListIterator để lặp qua Bộ sưu tập. Nếu Bộ sưu tập không phải là Danh sách để bắt đầu sử dụng Arrays.asList(Collection.toArray()) để biến nó thành Danh sách trước tiên.

0

Xem here.

iterator.nextIndex() sẽ cung cấp chỉ mục của phần tử sẽ được trả về bằng cách gọi tới số next().

+0

Iterator giao diện không có phương thức nextIndex().Bạn cần phải sử dụng một ListIterator rõ ràng cho điều đó, nhưng OP đã đặt câu hỏi cụ thể về Iterator. –

21

Đây là một cách để làm điều đó bằng biến của riêng bạn và giữ nó ngắn gọn:

List<String> list = Arrays.asList("zero", "one", "two"); 

int i = 0; 
for (Iterator<String> it = list.iterator(); it.hasNext(); i++) { 
    String s = it.next(); 
    System.out.println(i + ": " + s); 
} 

Output (bạn đoán nó):

0: zero 
1: one 
2: two 

Ưu điểm là bạn không tăng của bạn chỉ số trong vòng lặp (mặc dù bạn cần phải cẩn thận để chỉ gọi Iterator # tiếp theo một lần cho mỗi vòng lặp - chỉ cần làm điều đó ở đầu trang).

+2

Nếu bạn tự tạo trình lặp, bạn cũng có thể sử dụng một ListIterator và không cần biến int riêng biệt. –

+1

Nếu bạn sử dụng 'static import' cho Arrays.asList thì bạn chỉ có thể viết 'asList (" zero "," one "," two ")' – karmakaze

+0

đó chính là cách tôi đã làm trước khi tôi đọc câu trả lời của Paul . Tôi sẽ mạnh mẽ ngăn cản con đường của bạn, bởi vì tôi không thấy bất kỳ lợi thế nào cho nó. Bạn có nghĩ rằng có một lợi thế (ngoại trừ một lợi thế được đề cập). Tại sao bạn không sử dụng vòng lặp for-each? Xác định Iterator rõ ràng là không cần thiết, nếu bạn sử dụng biến của riêng bạn. –

75

Tôi đã có cùng một câu hỏi và được tìm thấy bằng cách sử dụng một ListIterator làm việc. Tương tự như thử nghiệm ở trên:

List<String> list = Arrays.asList("zero", "one", "two"); 

ListIterator iter = list.listIterator(); 

while (iter.hasNext()) { 
    System.out.println("index: " + iter.nextIndex() + " value: " + iter.next()); 
} 

Đảm bảo bạn gọi cho nextIndex TRƯỚC KHI bạn thực sự tiếp theo().

+1

Cảm ơn bạn đã đề cập đến 'Hãy chắc chắn rằng bạn gọi nextIndex TRƯỚC KHI bạn thực sự nhận được()' –

19

Bạn có thể sử dụng ListIterator để làm đếm:

final List<String> list = Arrays.asList("zero", "one", "two", "three"); 

for (final ListIterator<String> it = list.listIterator(); it.hasNext();) { 
    final String s = it.next(); 
    System.out.println(it.previousIndex() + ": " + s); 
} 
0

Tất cả bạn cần phải sử dụng nó iterator.nextIndex() để trở về chỉ số hiện tại là iterator là trên. Điều này có thể dễ dàng hơn một chút so với sử dụng biến số lượt truy cập của riêng bạn (mà vẫn hoạt động được).

public static void main(String[] args) {  
    String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"}; 
    List<String> list1 = new ArrayList<String>(Arrays.asList(str1)); 

    ListIterator<String> it = list1.listIterator(); 

    int x = 0; 

    //The iterator.nextIndex() will return the index for you. 
    while(it.hasNext()){ 
     int i = it.nextIndex(); 
     System.out.println(it.next() + " is at index" + i); 
    } 
} 

Mã này sẽ đi qua danh sách list1 một mục tại một thời điểm và in văn bản của mục, sau đó "là chỉ số", sau đó nó sẽ in chỉ số mà các iterator tìm thấy nó ở. :)

+1

Thực tế, mã của bạn bị tắt bởi vì nó cố gắng để hiển thị chỉ mục SAU gọi nó.next(). – Henrik

+1

Bạn là chính xác, cảm ơn bạn! Trả lời rất muộn trên phần của tôi lol. – Ryan

-3

chỉ làm một cái gì đó như thế này:

for (AbstractDevice device : mDevicesList){ 
int curIndex = mDevicesList.indexOf(device)); 

      } 
+4

Calling indexOf() sẽ yêu cầu quét thêm danh sách thiết bị. Nó sẽ nhanh hơn để đơn giản tăng bộ đếm cục bộ. –

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