Java ArrayList of Arrays包含返回意外结果

时间:2016-05-24 17:08:00

标签: java arrays arraylist contains

我正在为计算机和用户之间的Tic-Tac-Toe游戏编写代码。要进行移动,将提供未在板上占用的点列表作为参数,对于用户而言,该列表实际上仅用于比较输入是否在列表中。如果是这样,那就构成了一项法律举措。

这是我的代码。它一直说新的举动不包含在列表中,我不知道为什么。我在这里搜索了数据库中的类似问题,发现了一些相关但不是决定性的问题。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class UserTTTPlayer implements TicTacToePlayer{

@Override
public int[] makeMove(ArrayList<int []> unusedMoves) {

    Scanner in = new Scanner (System.in);
    System.out.println("Your move, user?");
    String input = in.nextLine();
    int [] move = checkInput(input, unusedMoves);
    while (move == null){
        input = in.nextLine();
        move = checkInput(input, unusedMoves);
    }

    return move;
}

private int [] checkInput(String input, ArrayList<int []> unusedMoves){

    System.out.println("Unused moves: ");
    for (int [] move: unusedMoves)
        System.out.println(Arrays.toString(move));

    //error checking for the length of the input
    if (input.length() < 1 || input.length() > 2){
        System.out.println("Invalid input. Please try again.");
        return null;
    }
    else{

        //convert the input from string to int
        int col = input.charAt(0) - 'a';
        int row = input.charAt(1) - '0';
        int [] move = {row, col};
        System.out.println("Intended move: " + Arrays.toString(move));
        System.out.println(unusedMoves.contains(move));

        //error checking for the bounds of the board
        if (col > 3 || col < 0 || row > 3 || col < 0){
            System.out.println("Invalid input.");
            return null;
        }

        //error checking for if the space is available
        else if (!unusedMoves.contains(move)){
            System.out.println("That space is already occupied.");
            return null;
        }
        return move;
    }
}
}

这是它的输出。我认为,董事会和其他印刷是来自不同的阶层,但与问题无关。我打印出列表,表明它有新动作,但仍包含返回false。

You go first. You will be X's.
  a b c
0 - - - 
1 - - - 
2 - - - 

Your move, user?
a0
Unused moves: 
[0, 0]
[0, 1]
[0, 2]
[1, 0]
[1, 1]
[1, 2]
[2, 0]
[2, 1]
[2, 2]
Intended move: [0, 0]
false
That space is already occupied.

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

正如评论所解释的那样,unusedMoves.contains(move)无法正常工作。 .contains方法使用列表中对象的.equals方法来检查给定值是否等于其中一个元素。但是,.equals数组方法不会比较元素,只使用==比较数组的标识。

例如:

int[] arr = {1, 2};

// prints false, as the array in the list is not *identical*
System.out.println(Arrays.asList(new int[]{1, 2}).contains(arr));

// prints true, as the array in the list *is* identical
System.out.println(Arrays.asList(arr).contains(arr));

考虑这个辅助方法:

private boolean contains(List<int[]> list, int[] arr) {
    return list.stream().anyMatch(x -> Arrays.equals(x, arr));
}

使用此辅助方法,您可以将unusedMoves.contains(move)替换为contains(unusedMoves, move),它应该按预期工作。