繁体   English   中英

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

[英]Compact manner to check if array contains particular element

我目前有以下代码:

    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();
            }
        }
    }

这里是数组的伪代码:

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

但是,当您只想检查它们是否在数组中时,有更好的方法。 创建具有变量xy对象Pair ,创建equals()hashCode()函数以使每个对具有唯一性(例如从string xy获取hashCode ),将所有输入放入Set ,然后检查给定的Pair(x,y)是否为在Set

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

对于您的问题,我有替代的解决方案。 从您的代码来看,我假设您正在编写与国际象棋有关的东西,而legalForBlack列表是允许玩家移动的一系列坐标。 IMO的最佳方法是在板上用索引(0到最大值63)编码每个正方形,并将所有这些正方形存储在<Integer,Coordinate>类型的Map中,其中Coordinate具有int x和int y。 如果坐标没有任何特殊用途,还可以跳过地图并将其转换为简单的允许正方形数组。 这仅需要您检查给定值是否在允许的平方列表中。 我希望这可以为您解决问题提供更好的方法。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM