【发布时间】:2012-11-04 03:38:07
【问题描述】:
我想使用链表来执行元素的提取和插入,尝试所有组合以进行启发式。链表对于这种类型的操作更有效。 因为我想尝试所有可能的提取/插入对,所以我在列表上使用了两个不同的迭代器。这会引发“ConcurrentModificationException”。我怎样才能有效地执行此操作,而无需每次都重新遍历列表,因为这会破坏首先使用列表的全部目的?
以下是代码的相关部分:
ListIterator<Integer> it1 = data.listIterator();
ListIterator<Integer> it2;
while(it1.hasNext()) {
int i = it1.next();
it2 = data.listIterator();
while(it2.hasNext()) {
if (i == it2.next()) continue; // continue right away when the indexes are equal
it1.remove();
it2.add(i);
if (length() < best)
return true;
}
// when the swap is not better/consistent
it2.remove();
it1.add(i);
}
return false;
谢谢
【问题讨论】:
-
如果通过一个迭代器更改列表,则不能使用任何其他迭代器。
-
你可以使用 ConcurrentLinkedQueue 代替它,因为它没有 CME 吗?我怀疑在任何情况下都有更有效的方法来做你正在做的任何事情。
-
请用谷歌搜索:www.google.com/search?q=multi+dimensional+linked+list+java 并检查类似dreamincode.net/forums/topic/…的结果
-
对于特定的启发式方法,我必须考虑所有可能的重新插入组合。必须评估所有组合。这是为了探索 NP-hard 问题的受限邻域 O(n^2)。
-
但是无论如何,您不能考虑将所有重新插入都放在一个列表中。您需要不同版本的列表。
标签: java iterator linked-list heuristics concurrentmodification