【问题标题】:Contains always returns false包含总是返回 false
【发布时间】:2018-12-02 17:49:31
【问题描述】:

我正在编写国际象棋游戏,但无法检查移动是否有效。

长话短说,我得到了具有

的 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 中...

【问题讨论】:

    标签: java lambda set contains


    【解决方案1】:

    不要使用Set&lt;int[]&gt;,而是使用Set&lt;Set&lt;Integer&gt;&gt;,因为数组没有实现equalshashCode方法,这就是contains不起作用的原因,这就是它返回false的原因。

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

    或者只使用Set&lt;Set&gt;,因为Set 实现了equalshashCode,您将能够使用contains 方法

    【讨论】:

    • for(int[] legalMoves : board.getSelectedTile().getPiece().getLegalMoves()) { if(Arrays.equals(legalMoves, new int[] {rowDifference, columnDifference})) { return true; } } 工作,谢谢
    猜你喜欢
    • 2021-09-23
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2021-11-05
    相关资源
    最近更新 更多