紧凑的方式来检查数组是否包含特定元素

时间:2016-04-29 12:40:09

标签: java

我目前有以下代码:

    int[][] legalForBlack = {{0,1},{1,0},{2,3},{3,2}};
    for (int x=0;x<boardSize;x++) {
        for (int y=0;y<boardSize;y++) {
            if (x,y) in legalForBlack
                methodA()
            else
                methodB()
        }
    }

当然这段代码不会编译。我正在寻找一种花哨而紧凑的方法来检查(x,y)何时在给定列表中。 我可以用4个if语句或循环来做到这一点,但这不是一个正确的方式imo。 我正在寻找能够在不断的时间内完成这项任务的事情。

编辑:

我想我找到了办法。你怎么看待这个?

int[][] legalForBlack = {{0,1},{1,0},{2,3},{3,2}}; // keep in order!
    int cur = 0;
    for (int x=0;x<boardSize;x++) {
        for (int y=0;y<boardSize;y++) {
            int[] buffer = legalForBlack[cur];
            if (x==buffer[0] && y==buffer[1]) {
                cur++;
                methodA();
            } else {
                methodB();
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

阵列的Heres伪代码:

input data in array
find x with for to match first column (legalForBlack[i][0])
   if x matches  legalForBlack[i][0] check if legalForBlack[i][1] matches y
   if yes, count it

但是有一种更好的方法,当你只想检查它们是否在阵列中时。使用变量Pairx创建对象y,创建equals()hashCode()函数,使每个对都具有唯一性(例如hashCode中的string xy {1}}),将所有输入放在Set中,然后检查Pair(x,y)中是否有Set

答案 1 :(得分:2)

boolean isLegal = false;
for(int[] coord: legalForBlack)
    if(Arrays.equals(coord, someXYArray)) {
        isLegal = true;
        break; //Credit to Adnan Isajbegovic
    }
if(isLegal) 
    methodA();
else 
    methodB();

答案 2 :(得分:2)

我为您的问题提供了另一种解决方案。从你的代码来看,我认为你正在写一些象棋相关的东西,你的legalForBlack列表是一系列允许玩家移动到的坐标。最好的方法IMO将使用索引(0到最大63)对板上的每个方块进行编码,并将所有这些存储在类型为&lt; Integer,Coordinate&gt;的Map中,其中Coordinate具有int x和int y。如果您对坐标没有任何特殊用途,您还可以跳过Map并将其转换为简单的允许方块数组。这只需要您检查给定值是否在允许的方块列表中。我希望这能让您更好地解决问题。祝你好运!