每次迭代更新Arraylist的内容

时间:2017-06-17 15:32:34

标签: java arraylist iteration

我正在尝试找到一种更新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);

2 个答案:

答案 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, 删除中间的元素需要复制它后面的元素。)