Skip to main content
 首页 » 编程设计

java之包含总是返回 false

2024年06月03日46wuhuacong

我正在编写国际象棋游戏,但在检查走法是否有效时遇到了麻烦。

长话短说,我得到了 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 语句 中......

请您参考如下方法:

不要使用 Set<int[]> ,而是使用 Set<Set<Integer>>因为数组没有实现 equalshashCode方法,这就是为什么 contains行不通,这就是它返回 false 的原因.

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

或者只使用 Set<Set>因为Set工具 equalshashCode你将能够使用contains方法