Содержит всегда возвращает ложь - PullRequest
0 голосов
/ 23 июня 2018

Я пишу игру в шахматы, и у меня возникли проблемы с проверкой правильности хода.

Короче говоря, у меня есть класс Pawn (extends Piece) с

 //First element of array represents row, second element of array represents column
 Set<int[]> legalMoves = new HashSet<>();

 void initLegalMoves() {
    if(color == PieceColor.WHITE) {
        legalMoves.add(new int[] {-1, 0});
    } else {
        legalMoves.add(new int[] {1, 0});
    }
 }

ТеперьУ меня есть другой класс MoveValidator, который, очевидно, проверяет, действительно ли ход.

    private boolean isLegalMove(int oldRow, int oldColumn, int newRow, int newColumn){
        int rowDifference = newRow - oldRow;
        int columnDifference = newColumn - oldColumn;

        board.getSelectedTile().getPiece().getLegalMoves().forEach(x -> {
            if(x[0] == rowDifference && x[1] == columnDifference){
                System.out.println("Ok move");
            }
        });
        return board.getSelectedTile().getPiece().getLegalMoves().contains(new int[] {rowDifference, columnDifference});
    }

Хотя это не похоже на работу, возвращаемое значение всегда ложно.Остальная часть кода кажется релевантной, forEach Я поставлю перед выводом «Ok move», когда move действительно в порядке.Я мог бы, вероятно, достичь того, что хочу, с некоторыми Iterator и for loops, но почему contains всегда возвращает false?Нужно ли переопределять equals() для класса, который я хочу проверить таким образом?Не могу сделать это для int[] tho, верно?С другой стороны, я мог бы просто использовать лямбду и forEach, как я сделал, чтобы напечатать значение.Тем не менее, я не могу просто поместить return true внутрь этого if statement ...

1 Ответ

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

Не используйте Set<int[]>, вместо этого используйте Set<Set<Integer>>, потому что массив не реализует метод equals и hashCode, и поэтому contains не будет работать, и поэтому он возвращает false.

Один из вариантов - это итерация по Set<int[]> и сравнение каждого элемента методом Arrays.equals().

Или просто используйте Set<Set>, потому что Set реализует equals и hashCode, и вы сможете использовать contains метод

...