ฉันใช้ Iterator เพื่อวนซ้ำผ่านคอลเลกชันและฉันต้องการรับดัชนีขององค์ประกอบปัจจุบัน
ฉันจะทำเช่นนั้นได้อย่างไร?
ฉันใช้ Iterator เพื่อวนซ้ำผ่านคอลเลกชันและฉันต้องการรับดัชนีขององค์ประกอบปัจจุบัน
ฉันจะทำเช่นนั้นได้อย่างไร?
คำตอบ:
ใช้ตัวแปรของคุณเองและเพิ่มขึ้นในลูป
it.nextIndex()
เสนอแนะเกี่ยวกับ มีประโยชน์เมื่อคอลเลกชันเป็นรายการ
ฉันมีคำถามเดียวกันและพบว่าการใช้ ListIterator ทำงานได้ คล้ายกับการทดสอบด้านบน:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
ตรวจสอบให้แน่ใจว่าคุณเรียก nextIndex ก่อนที่คุณจะได้รับ () ถัดไป
นี่คือวิธีที่ทำได้โดยใช้ตัวแปรของคุณเองและทำให้กระชับ:
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);
}
ผลลัพธ์ (คุณเดาได้):
0: zero
1: one
2: two
ข้อดีคือคุณไม่เพิ่มดัชนีของคุณภายในลูป (แม้ว่าคุณจะต้องระมัดระวังในการเรียก Iterator # ถัดไปเพียงครั้งเดียวต่อลูป - ทำที่ด้านบนสุด)
asList("zero", "one", "two")
คุณสามารถใช้ListIterator
เพื่อทำการนับ:
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);
}
สะสมแบบไหน? หากเป็นการใช้งานอินเทอร์เฟซรายการคุณก็สามารถit.nextIndex() - 1
ใช้ได้
ใช้ListIteratorเพื่อวนซ้ำผ่าน Collection หากคอลเล็กชันไม่ใช่รายการให้เริ่มใช้Arrays.asList(Collection.toArray())
เพื่อเปลี่ยนเป็นรายการก่อน
ใช้ int และเพิ่มขึ้นภายในวงของคุณ
เพียงแค่ทำสิ่งนี้:
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.
}
ดูที่นี่ .
iterator.nextIndex()
next()
จะให้ดัชนีขององค์ประกอบที่จะถูกส่งกลับโดยการเรียกภายหลัง
สิ่งที่คุณต้องใช้ iterator.nextIndex () เพื่อส่งคืนดัชนีปัจจุบันที่ตัววนซ้ำเปิดอยู่ สิ่งนี้อาจง่ายกว่าการใช้ตัวแปรตัวนับของคุณเองเล็กน้อย (ซึ่งยังใช้งานได้)
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);
}
}
รหัสนี้จะผ่าน list1 รายการทีละรายการและพิมพ์ข้อความของรายการจากนั้น "อยู่ที่ดัชนี" จากนั้นจะพิมพ์ดัชนีที่ตัววนซ้ำพบที่ :)
แม้ว่าคุณจะได้รับคำตอบแล้ว แต่ก็ควรเพิ่มข้อมูล
ดังที่คุณได้กล่าวถึงคอลเล็กชันอย่างชัดเจนคุณไม่สามารถใช้listIterator
เพื่อรับดัชนีสำหรับคอลเล็กชันทุกประเภท
รายการอินเทอร์เฟซ - ArrayList, LinkedList, Vector และ Stack
มีทั้งiterator()
และlistIterator()
ตั้งค่าอินเทอร์เฟซ - HashSet, LinkedHashSet, TreeSet และ EnumSet
มีเพียง iterator()
อินเทอร์เฟซแผนที่ - HashMap, LinkedHashMap, TreeMap และ IdentityHashMap
ไม่เคยมีใคร iterators แต่สามารถใช้ซ้ำผ่านkeySet()
/ values()
หรือentrySet()
เป็นkeySet()
และentrySet()
ผลตอบแทนSet
และผลตอบแทนvalues()
Collection
ดังนั้นจึงดีกว่าที่จะใช้iterators()
กับการเพิ่มค่าอย่างต่อเนื่องเพื่อรับดัชนีปัจจุบันสำหรับประเภทคอลเลกชันใด ๆ
นี่จะเป็นทางออกที่ง่ายที่สุด!
std::vector<double> v (5);
for(auto itr = v.begin();itr != v.end();++itr){
auto current_loop_index = itr - v.begin();
std::cout << current_loop_index << std::endl;
}
ทดสอบกับ gcc-9 พร้อม-std=c++11
แฟล็ก
เอาท์พุต:
0
1
2
3
4