我正在尝试找到一种更新ArrayList内容的方法,其中一个元素如果根据条件迭代删除。我所拥有的是一种算法,它使用用户选择的方法(通过开关案例)以特定方式解决问题。但是,如果在一定量的迭代后没有找到任何改进,它会随机选择一个不同的可用方法(case)。
目标: 如果选择了某个方法,则该方法不应再次可用。
代码:
public Solution solve() throws IOException, EclipseException {
// Account for all the available switch cases
ArrayList<Integer> selection = new ArrayList<Integer>();
for(int y = 1; y < 12; y++) {
selection.add(new Integer(1*y));
}
ArrayList<Integer> listToKeep = new ArrayList<Integer>();
for (int i = 0; i < iterations; i++) {
// Iterative process with a counter for each iteration that provides
// no improvement
if (counter == 6) {
for (Integer num : selection) {
if (num != method){
listToKeep.add(num);
}
}
selection.clear();
selection.addAll(listToKeep);
System.out.println("Sent for selection " + selection);
Random rand = new Random();
method = selection.get(rand.nextInt(selection.size()));
System.out.println("New randomly selected method is: " + method);
solve(method);
}
}
return bestSolution;
}
期望的结果:
All cases: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Initital method chosen: 1
Sent for selection [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
New randomly selected method is: 8
Sent for selection [2, 3, 4, 5, 6, 7, 9, 10, 11]
New randomly selected method is: 9
etc.
问题: for循环一直引用包含所有数字的原始ArrayList选择(而不是基于listToKeep更新的on),并且仅删除最后选择的case。
问题: 我怎样才能确保每次迭代都能正确更新选择ArrayList?
非常感谢任何反馈或替代方法!
解决方案编辑18-06
if (!alreadyExecuted){
selection = IntStream.range(1, 12).boxed().collect(Collectors.toList());
Collections.shuffle(selection);
}
alreadyExecuted = true;
int newMethod = selection.get(selection.size() - 1);
selection.remove(selection.size() - 1);
答案 0 :(得分:0)
如果是并发修改,您可以使用Iterator
。像
List<Integer> selection = new ArrayList<>();
for (Iterator<Integer> iterator = selection.iterator(); iterator.hasNext();) {
Integer val = iterator.next();
if (check_for_condition) {
// Remove the current element from the iterator and the list.
iterator.remove();
}
}
答案 1 :(得分:0)
而不是从列表中删除随机元素, 改组清单会更简单,更有效率, 并始终采取最后一个元素。
List<Integer> selection = IntStream.range(1, 13).boxed().collect(Collectors.toList());
Collections.shuffle(selection);
此列表的最后一个元素是随机的。
删除最后一个元素很便宜。
(如果您的示例中为ArrayList
,
删除中间的元素需要复制它后面的元素。)