我目前有以下代码:
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();
}
}
}
答案 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
但是有一种更好的方法,当你只想检查它们是否在阵列中时。使用变量Pair
和x
创建对象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并将其转换为简单的允许方块数组。这只需要您检查给定值是否在允许的方块列表中。我希望这能让您更好地解决问题。祝你好运!