其实下面用的方法的原理用单向链表和双向链表的思路去想,就会发现一切都是那么的自然
Iterator
Iterator
的方法:
方法 功能
hasNext()
判断集合列表中是否还有可以迭代的元素next()
返回下一个元素remove()
移除最近返回的一个元素
ArrayList<Character> list = new ArrayList<>();
for (char c = 'A'; c <= 'G'; c++) {
list.add(c);
}
Iterator<Character> it = list.iterator();
while (it.hasNext()) {
char c = it.next(); // next() 返回下一个元素
if (c == 'C') {
it.remove(); // remove() 移除元素
}
}
运行结果 :[A, B, D, E, F, G]
ListIterator
ListIterator
的方法
方法 功能
- hasNext() 判断是否还有下一个元素可以迭代
- next() 返回下一个元素
- hasPrevious() 判断是否还有上一个元素可以迭代
- previous() 返回上一个元素
- add() 添加一个元素,会加到当前元素的后一个位置
- set(E e) 用指定的元素替换最近返回的元素
- remove() 移除最近返回的元素
//[0,1,2,3]
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <= 3; i++) {
list.add(i);
}
ListIterator<Integer> li = list.listIterator();
boolean flag = true;
// 如果是正序迭代 或者 有前一个可以迭代的元素
while (flag || li.hasPrevious()) {
int index = 0;
int ele = 0;
if (flag) {
index = li.nextIndex(); // nextIndex() 返回下一个元素的索引
ele = li.next(); // next() 返回下一个元素
} else {
index = li.previousIndex(); // previousIndex 返回上一个元素的索引
ele = li.previous(); // previous() 返回上一个元素
}
if (ele == 1) {
// 如果迭代到的元素是 1 ,则将该元素替换成 0
li.set(0); // set() 用指定元素替换最后返回的元素
} else if (ele == 3) {
// remove() 移除最后返回的元素
//和下面的add类似,如果使用了获取下标方法,这个时候原list,元素3后面的元素的下标都会 -1
li.remove();
}
System.out.println("(" + index + ") = " + ele);
// 判断是否还有下一个可以迭代的元素
if (!li.hasNext()) {
flag = false;
// add() 添加一个元素,会加到当前元素的后一个位置
// 此时迭代的时候还是迭代之前的元素,这个新加的元素不会参与进来
// 但是如果代码里有使用 li.nextIndex() 获取下标的方法,这个时候因为新加了一个元素,对于当前的这个demo来说,就是0和1之前插入了一个值为10,这个时候1的下标其实变成了2,其余元素的下标依次递增 + 1
li.add(10);
}
}
Iterator 和 ListIterator 主要区别
- ListIterator有add()方法,可以向List中添加对象,而Iterator不能
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
- ListIterator 可以再迭代时对集合进行add、set、remove操作,而Iterator迭代器只能在迭代时对集合进行
remove 操作