Tôi đang sử dụng một Iterator để lặp qua một tập hợ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 tôi có thể làm điều đó?
Tôi đang sử dụng một Iterator để lặp qua một tập hợ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 tôi có thể làm điều đó?
Câu trả lời:
Sử dụng biến của riêng bạn và tăng nó trong vòng lặp.
it.nextIndex()
. Hữu ích khi bộ sưu tập là một Danh sách.
Tôi đã có cùng một câu hỏi và thấy rằng việc sử dụng ListIterator đã hoạt động. 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 rằng bạn gọi nextIndex TRƯỚC KHI bạn thực sự nhận được nextIndex ().
Đây là một cách để làm điều đó bằng cách sử dụng biến của riêng bạn và giữ cho 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);
}
Đầu ra (bạn đoán nó):
0: zero
1: one
2: two
Ưu điểm là bạn không tăng chỉ mục của mình trong vòng lặp (mặc dù bạn cần phải cẩn thận chỉ gọi tiếp theo Iterator # một lần cho mỗi vòng lặp - chỉ cần thực hiện ở trên cùng).
asList("zero", "one", "two")
Bạn có thể sử dụng ListIterator
để đế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);
}
Bộ sưu tập kiểu gì? Nếu đó là một triển khai của giao diện Danh sách thì bạn chỉ có thể sử dụng it.nextIndex() - 1
.
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.
chỉ cần làm một cái gì đó như thế này:
ListIterator<String> it = list1.listIterator();
int index = -1;
while (it.hasNext()) {
index++;
String value = it.next();
//At this point the index can be checked for the current element.
}
Sử dụng một int và tăng nó trong vòng lặp của bạn.
Xem tại đây .
iterator.nextIndex()
sẽ cung cấp chỉ mục của phần tử sẽ được trả về bằng lệnh gọi tới next()
.
Tất cả những gì bạn cần để sử dụng nó là iterator.nextIndex () để trả về chỉ mục hiện tại của trình vòng lặp. Điều này có thể dễ dàng hơn một chút so với việc sử dụng biến bộ đếm của riêng bạn (biến bộ đếm vẫn hoạt động).
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 từng mục một và in văn bản của mục đó, sau đó "đang ở chỉ mục" sau đó nó sẽ in chỉ mục mà trình lặp tìm thấy nó ở đó. :)
Mặc dù bạn đã có câu trả lời, hãy nghĩ rằng hãy thêm một số thông tin.
Như bạn đã đề cập đến Bộ sưu tập một cách rõ ràng, bạn không thể sử dụng listIterator
để lấy chỉ mục cho tất cả các loại bộ sưu tập.
Liệt kê các giao diện - ArrayList, LinkedList, Vector và Stack.
Có cả hai iterator()
vàlistIterator()
Đặt giao diện - HashSet, LinkedHashSet, TreeSet và EnumSet.
Chỉ có iterator()
Giao diện bản đồ - HashMap, LinkedHashMap, TreeMap và IdentityHashMap
Không có trình vòng lặp, nhưng có thể được lặp lại bằng cách sử dụng thông qua keySet()
/ values()
hoặc entrySet()
as keySet()
và entrySet()
trả về Set
và values()
trả vềCollection
.
Vì vậy, tốt hơn là sử dụng iterators()
với sự gia tăng liên tục của một giá trị để có được chỉ mục hiện tại cho bất kỳ loại tập hợp nào.