包含总是返回false

时间:2018-06-23 13:33:36

标签: java lambda set contains

我正在写象棋游戏,在检查移动是否有效时遇到了麻烦。

长话短说,我拥有具有

的Pawn(扩展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});
    }

尽管它似乎不起作用,但返回值始终为false。其余代码似乎很相关,forEach我确实在移动确实可以的情况下在打印“ Ok move”之前放过。我可能可以通过一些Iteratorfor loops实现我想要的功能,但是为什么contains总是返回false?我是否需要覆盖equals()这样的类进行检查? int[]做不到,对吗? 另一方面,我可以像打印值一样使用lambda和forEach。不过,我不能简单地将return true放在那个if statement ...

1 个答案:

答案 0 :(得分:3)

请勿使用Set<int[]>,而应使用Set<Set<Integer>>,因为数组不能实现equalshashCode方法,这就是contains无法正常工作的原因这就是为什么它返回false

一个选项是遍历Set<int[]>并通过Arrays.equals()方法比较每个元素。

或者只使用Set<Set>,因为Set实现了equalshashCode,您将可以使用contains方法