需求:對集合數據進行整理,有時需要便循環邊刪除一些無用的信息
實現過程中,使用for循環與foreach會出現異常下標溢出。是因爲使用上述兩者會改變集合長度。
此時你可能會想新建一個集合用來存儲,此舉大可不必。用迭代器解決即可。
例如以下代碼: 刪除集合中的偶數
List<Integer> lst = new ArrayList<Integer>();
lst.add(1);
lst.add(2);
lst.add(3);
lst.add(4);
lst.add(5);
lst.add(6);
Iterator<Integer> it = lst.iterator();
while (it.hasNext()) {
int value = it.next();
System.out.println(value);
if(value%2==0){
it.remove();
}
}
System.out.println("----------------------------");
System.out.println(lst.size());
擴展
Iterator 和 ListIterator 區別?
Iterator 可以遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List。
Iterator 只能單向遍歷,而 ListIterator 可以雙向遍歷(向前/後遍歷)。
ListIterator 實現 Iterator 接口,然後添加了一些額外的功能,比如添加一個元素、替換一個元素、獲取前面或後面元素的索引位置。
例如以下代碼:
ArrayList<Integer> lst = new ArrayList<Integer>();
lst.add(1);
lst.add(2);
lst.add(3);
lst.add(4);
lst.add(5);
lst.add(6);
ListIterator<Integer> it = lst.listIterator();
System.out.println("====================從前遍歷========================");
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("====================從後遍歷========================");
while(it.hasPrevious()) {
System.out.println(it.previous());
}
System.out.println("====================指定位置向前遍歷========================");
it = lst.listIterator(4);
while(it.hasPrevious()){
System.out.println(it.previous());
}
//替換方法
while(it.hasNext()) {
Integer value = it.next()+10;
it.set(value);
}
System.out.println("====================替換後的值========================");
for (Integer str : lst) {
System.out.println(str);
}