添加的最后一个元素将覆盖List中的所有对象。 Java的

时间:2017-01-27 13:22:24

标签: java list arraylist

我在循环中检查res的内容(给定动作a的下一个状态)并且它们是正确的。它确实添加到前沿列表,但值都是相同的,res的最后一次迭代。

let inline listMax xs = List.reduce max xs

3 个答案:

答案 0 :(得分:1)

我猜您已尝试实施Breadth-first search

从您的实施中看起来您错过了这一步:if n is not in S: 因此,如果您的图表中没有循环,它就可以正常工作。在其他情况下,你会陷入无限循环。

此外,此代码中存在很多错误:

public State BFSearch(){     
     State initial = new State(array);
     LinkedList<State> frontier = new LinkedList<State>();
     frontier.add(initial); <-- initially you have 1 element in list


     while(!frontier.isEmpty()){
        State currentState = new State(); <-- You don't need to create new instance because you'll overwrite it on next step
        currentState = frontier.removeFirst(); <-- you remove initial element

        if(goalTest(currentState)){
            System.out.println("goal");
            return currentState;
        }
        else{
            for (Point a : Actions(currentState)) { <-- I guess Actions is method which returns N points
                State res = new State(); <-- You don't need to create instance because you overwrite it on next step
                res = Result(currentState,a); <-- is it method with just return state or you just missed `new` 
                 <-- here should be check for existent `res` in `frontier` -->

                frontier.add(res); <-- there you put N new steps
            }

        }
     }
     return null; 
}

您的实施可能如下:

public State BFSearch() {
    State initial = new State(arrays);
    List<State> frontier = new LinkedList<>();
    frontier.add(initial);


    while (!frontier.isEmpty()) {
        State currentState = frontier.removeFirst();

        if (goalTest(currentState)) {
            System.out.println("goal");
            return currentState;
        } else {
            for (Point a : actions(currentState)) {
                State res = result(currentState, a);
                if (!frontier.contains(res)) {
                    frontier.add(res);
                }
            }

        }
    }
    return null;
}

重要 确保您在equals实施中正确实施了hashCodeState方法

答案 1 :(得分:0)

这在声明currentState = frontier.removeFirst();中非常明显 因为它在while循环中,最终所有元素都被删除。 如果您不想删除,可以尝试peekFirst()方法。

答案 2 :(得分:0)

很难完全按照你的行为做什么或你的问题是什么,但是从我收集你的东西中删除第一个元素(从最初可能是单个元素列表的列表中删除),然后你&#39 ;重新检查以查看它是否符合条件,如果不是,您将从函数返回它,如果不是,则根据另一个集合填充元素。然后重复上述内容,直到第一个元素是你想要的元素?您是否尝试过打印&#34;结果(currentState,a)&#34;在循环中,看看它给你什么?或者在进入下一次迭代之前打印出列表?