我有一个二维整数数组,表示我用来跟踪游戏中对象位置的地图。它会被程序系统修改,该程序系统将更改其中的数字以放置不同的对象。我将每个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.
}
答案 0 :(得分:4)
你可以这样做:
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 */;
答案 1 :(得分:1)
如果您希望索引包含&#39;如你所描述的那样,这应该可以工作:
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;