我的分词结果链表需要合并连续的数字和日期,所以需要熟悉一下Java Collection在遍历的过程中同时删除、合并元素的小trick。自己试验了一下,活用listIterator的previous()和next()方法就可以达到目的。
遍历中删除
数据集
List integerList = new LinkedList();
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 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
{
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异常,所以只能操作单个迭代器。