我的分词结果链表需要合并连续的数字和日期,所以需要熟悉一下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);
也就是
[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);
输出:
[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);
输出:
[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);
也就是
[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);
输出
[2, 1, 4, 2, 6, 3, 8, 4, 10, 5]
值得注意的是,上面并没有合并所有相同的项,因为在一句listIterator.set(current + next);之后,前后就不相等了。
本来想用两个迭代器去做,但是一个迭代器删除之后,会导致另一个迭代器失效,抛出ConcurrentModificationException异常,所以只能操作单个迭代器。
jdk8 Stream,的filter过滤list也可以实现