Почему метод contains () в Java не работает должным образом? - PullRequest
0 голосов
/ 05 июня 2018

Я пишу метод, который создает ArrayList S_Comp, который содержит все элементы, которые включены в массив allNodes, но которые не включены в ArrayList solution (все элементы которого включены в allNodes).Когда я печатаю solution и allNodes, я легко вижу, что S_Comp должен содержать 7 элементов.Однако все элементы из allNodes добавляются в S_Comp, а также элементы, включенные в nodesS.В чем может быть проблема здесь?

Ниже вы можете найти мой код для метода.Перед вызовом этого метода S_Comp был инициализирован только как new ArrayList<MyNodesData>, поэтому его размер равен 0.

public void generateSComp(DataFile testDataFile, ArrayList<Route> solution, ArrayList<MyNodesData> S_Comp)
    {
        System.out.println("solution: " + solution.toString());
        ArrayList<MyNodesData> nodesS = getNodesS(solution);
        System.out.println("NodesS: " + nodesS.toString());
        System.out.println("Size nodesS: " + nodesS.size());
        MyNodesData[] allNodes = testDataFile.getNodes();
        System.out.println("allNodes: " + Arrays.toString(allNodes));
        for(MyNodesData node : allNodes)
        {
            if(!nodesS.contains(node))
            {
                System.out.println(node.toShortString() + " is not in nodesS");
                S_Comp.add(node);
            }
        }

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

переопределяет хэш-код и метод equals в классе MyNodesData, а затем проверяет.

0 голосов
/ 05 июня 2018

Обратитесь сюда для получения информации о методе javadoc ArrayList здесь: https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#contains-java.lang.Object-

Он говорит:

public boolean содержит (Object o)

Возвращает true, еслиэтот список содержит указанный элемент.Более формально, возвращает true тогда и только тогда, когда этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)).

Таким образом, он будетработать только в том случае, если вы переопределите метод equals класса объекта , как вы хотите в классе MyNodesData .Более того, поскольку вы уже знаете договор между equals () и методом hashcode (), настоятельно рекомендуется переопределить hashcode () вместе с equals () .

Для получения дополнительной информации: Почему мне нужно переопределить методы equals и hashCode в Java?

0 голосов
/ 05 июня 2018

содержит работы так же, как и ожидалось, он проверит, если объект, который вы передаете equals объект в списке.Поэтому, если вы не получаете ожидаемое поведение, потому что эти объекты не равны.

Вам придется отладить этот код, чтобы проверить, почему equals не возвращает то, что вы ожидаете.

Редактировать:Я прочитал, что вы не переопределяете equals и hashcode в классе MyNodesData, поэтому вы должны сделать это так, как другие люди предлагают

...