List集合特有迭代器:ListIterator

!!! note 目录

List集合特有迭代器:ListIterator

一、特有的迭代方式

  1. ListIterator<E> listIterator(); 获取List集合特有的迭代器(该迭代器功能更加强大,但只适合于List集合使用)
  2. ListIterator<E> listIterator(int index); 从列表中的指定位置开始,返回列表中元素的列表迭代器

二、ListIterator接口中的常用方法

修饰符和类型 方法 描述
void add(E e) 将元素插入到当前迭代器的位置,然后将迭代器的位置移动到新添加的元素之后。如果不重新设置迭代器的位置或者重新开始遍历列表,可能会跳过新添加的元素。
boolean hasNext() 返回true此列表迭代器在向前遍历列表时是否具有更多元素。
boolean hasPrevious() 返回true此列表迭代器在反向遍历列表时是否具有更多元素。
E next() 返回列表中的下一个元素并前进光标位置。
int nextIndex() 返回后续调用将返回的元素的索引next()
E previous() 返回列表中的前一个元素并将光标位置向后移动
int previousIndex() 返回后续调用将返回的元素的索引previous()
void remove() 从列表中删除next()或返回的最后一个元素previous()(可选操作)。
void set(E e) 用指定元素替换next()或返回的最后一个元素(可选操作)previous()

2.1 遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package List;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorTest {

private static List<String> list = new ArrayList<>();

static {
list.add("camellia");
list.add("xiaohua");
}

/**
* 使用ListIterator进行遍历
*/
@Test
public void testListIterator(){
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) System.out.println(lit.next());
}


}

2.2 测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package List;

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListIteratorTest {

private static List<String> list = new ArrayList<>();

static {
list.add("camellia");
list.add("xiaohua");
}

/**
* 使用ListIterator进行遍历
*/
@Test
public void testListIterator(){
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) System.out.println(lit.next());
}

/**
* ListIterator的add方法,将元素插入集合。
* add 方法会将元素插入到当前迭代器的位置,然后将迭代器的位置移动到新添加的元素之后。
* 如果不重新设置迭代器的位置或者重新开始遍历列表,可能会跳过新添加的元素。
*/
@Test
public void testListIteratorAdd(){
ListIterator<String> lit = list.listIterator();
lit.add("哈哈哈");
//重新遍历
testListIterator();
}

/**
* 判断光标当前指向的位置的上一个位置是否存在元素,并返回元素。
*/
@Test
public void testListIteratorPrevious(){
ListIterator<String> lit = list.listIterator();
lit.next();
//判断光标当前指向的位置的上一个位置是否存在元素,如果存在就取出。
while (lit.hasPrevious()) System.out.println(lit.previous());
}

/**
* 获取光标所指位置的下标以及所指位置的上一个下标
*/
@Test
public void testListIteratorNextIndex(){
ListIterator<String> li = list.listIterator();
while (li.hasNext()){
System.out.println(li.nextIndex());
li.next();
}
System.out.println(li.previousIndex());
}

/**
* 修改的是上一次next()返回的那个数据(修改是集合中的)。set()方法调用的前提是:先调用了next()方法,否则会报错。
*/
@Test
public void testListIteratorSet(){
ListIterator<String> li = list.listIterator();
while (li.hasNext())if(li.next().equals("xiaohua"))li.set("小花");
testListIterator();
}

/**
* 删除上一次next()方法返回的那个数据(删除的是集合中的)。remove()方法调用的前提是:先调用next()方法。否则会报错。
*/
@Test
public void testListIteratorRemove(){
ListIterator<String> li = list.listIterator();
while (li.hasNext())if(li.next().equals("xiaohua"))li.remove();
testListIterator();
}

}