有没有一种更干净的方法可以保持在数组的边界内

本文关键字:边界 数组 方法 有没有 一种 | 更新日期: 2023-09-27 18:21:44

我有一个二维整数数组,它表示我用来跟踪游戏中对象位置的地图。它被一个程序系统修改,该系统将更改其中的数字以放置不同的对象。我将每个Int的值设置为0,1或2。看起来像这样:

00010
00100
02120
21200
12000

由于过程步骤在很大程度上依赖于随机化,我想进行几次检查,如果我试图写入的数组位置在数组的边界之外,它将回落到映射的边缘,而不是导致故障。例如,我试图在[0,10]中放入一个条目,它将默认为[0,4]。是的,我知道我应该小心,确保我永远不会试图在数组的边界之外写入,但考虑到其他元素,这些元素不会每次都发生。理智检查似乎很谨慎。

我提出的解决方案是可行的,但似乎过于繁琐和冗长。有没有我不知道的更清洁的解决方案?

这是代码示例:

//Example of something randomly being written to the array
random r = new Random();
int xMax = field.GetLength(0);
field[mid(r.next(0,5), 0, xMax), 0] = 1; 
//Method for sanity bounds.
private static int mid(int target, int min, int max)
{
    //Target is the value we want
    //Min is the smallest possible value
    //Max is the largest possible value.
    if (target == min)
    {
        return min;
    }
    if (target == max)
    {
        return max;
    }
     if (target < max && target > min)
    {
        return target;
    }
    else if (target > max && target > min)
    {
        return max;
    }
    else if (target < min && target < max)
    {
        return min;
    }
    return min; //This shouldn't ever get trigger.  In here so compiler won't complain.
}

有没有一种更干净的方法可以保持在数组的边界内

您可以执行以下操作:

public int mid(int target, int min, int max)
{
    return Math.max(min, Math.min(max, target));
}

此函数返回预期值和最大界限中较小值的最大值,确保返回有效值。


如果使用矩形二维数组,也可以在访问中使用%

array[index1 % array.length][index2 % array[0].length] = /* somevar */;

如果您希望索引像您所描述的那样"包装"在数组周围,这应该是有效的:

public void GetValidIndexForArrayFromRandomIndex(int index, string[] myArray)
{
    var upperBound = myArray.GetUpperBound(0);
    var lowerBound = myArray.GetLowerBound(0);
    while (index > upperBound)
    {
        index -= upperBound + 1;
    }
    while (index < lowerBound)
    {
        index += upperBound;
    }
    return index;
}

或者这应该做你上面的代码所做的:

// We really only need to test the upper and lower bounds. 
// If target is greater than max or less than min, then return the bound that it crossed
if (target > max) return max;
if (target < min) return min;
// Otherwise, it's within the bounds, so just return target.
return target;

或者你可以用一行代码:

return (target > max) ? max : (target < min) ? min : target;