我的分词结果链表需要合并连续的数字和日期,所以需要熟悉一下Java Collection在遍历的过程中同时删除、合并元素的小trick。自己试验了一下,活用listIterator的previous()和next()方法就可以达到目的。
遍历中删除
数据集
- List<Integer> integerList = new LinkedList<Integer>();
- for (int i = 1; i <= 10; ++i)
- {
- integerList.add(i);
- }
- System.out.println(integerList);
- List<Integer> integerList = new LinkedList<Integer>();
- for (int i = 1; i <= 10; ++i)
- {
- integerList.add(i);
- }
- System.out.println(integerList);
也就是
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
遍历中删除所有奇数
- // 遍历中删除所有奇数
- ListIterator<Integer> listIterator = integerList.listIterator();
- while (listIterator.hasNext())
- {
- Integer next = listIterator.next();
- if (next % 2 == 1)
- {
- listIterator.remove();
- }
- }
- System.out.println(integerList);
- // 遍历中删除所有奇数
- ListIterator<Integer> listIterator = integerList.listIterator();
- while (listIterator.hasNext())
- {
- Integer next = listIterator.next();
- if (next % 2 == 1)
- {
- listIterator.remove();
- }
- }
- System.out.println(integerList);
输出:
[2, 4, 6, 8, 10]
[2, 4, 6, 8, 10]
遍历中合并
数据集
数据集接上面的输出
遍历中合并前后和为10的项
- // 遍历中合并前后和为10的项
- listIterator = integerList.listIterator();
- Integer next = listIterator.next();
- while (listIterator.hasNext())
- {
- Integer current = next;
- next = listIterator.next();
- if (current + next == 10)
- {
- // 此时listIterator指向6
- listIterator.remove();
- // 删除后listIterator还是指向6,但是其元素是无效的
- listIterator.previous();
- // 回退到4,将其合并为10
- listIterator.set(10);
- // 接下来会next到8
- }
- }
- System.out.println(integerList);
- // 遍历中合并前后和为10的项
- listIterator = integerList.listIterator();
- Integer next = listIterator.next();
- while (listIterator.hasNext())
- {
- Integer current = next;
- next = listIterator.next();
- if (current + next == 10)
- {
- // 此时listIterator指向6
- listIterator.remove();
- // 删除后listIterator还是指向6,但是其元素是无效的
- listIterator.previous();
- // 回退到4,将其合并为10
- listIterator.set(10);
- // 接下来会next到8
- }
- }
- System.out.println(integerList);
输出:
[2, 10, 8, 10]
[2, 10, 8, 10]
数据集
- // 遍历中合并前后相等的项
- integerList.clear();
- for (int i = 1; i <= 5; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- integerList.add(i);
- }
- }
- System.out.println(integerList);
- // 遍历中合并前后相等的项
- integerList.clear();
- for (int i = 1; i <= 5; ++i)
- {
- for (int j = 0; j < 3; ++j)
- {
- integerList.add(i);
- }
- }
- System.out.println(integerList);
也就是
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5]
遍历中合并前后相等的项
- listIterator = integerList.listIterator();
- next = listIterator.next();
- while (listIterator.hasNext())
- {
- Integer current = next;
- next = listIterator.next();
- if (current == next)
- {
- // 此时listIterator指向6
- listIterator.remove();
- // 删除后listIterator还是指向6,但是其元素是无效的
- listIterator.previous();
- // 回退到4,将其合并为10
- listIterator.set(current + next);
- // 接下来会next到8
- }
- }
-
- System.out.println(integerList);
- listIterator = integerList.listIterator();
- next = listIterator.next();
- while (listIterator.hasNext())
- {
- Integer current = next;
- next = listIterator.next();
- if (current == next)
- {
- // 此时listIterator指向6
- listIterator.remove();
- // 删除后listIterator还是指向6,但是其元素是无效的
- listIterator.previous();
- // 回退到4,将其合并为10
- listIterator.set(current + next);
- // 接下来会next到8
- }
- }
-
- System.out.println(integerList);
输出
[2, 1, 4, 2, 6, 3, 8, 4, 10, 5]
[2, 1, 4, 2, 6, 3, 8, 4, 10, 5]
值得注意的是,上面并没有合并所有相同的项,因为在一句listIterator.set(current + next);之后,前后就不相等了。
本来想用两个迭代器去做,但是一个迭代器删除之后,会导致另一个迭代器失效,抛出ConcurrentModificationException异常,所以只能操作单个迭代器。