我想编写一个将2D数组大小调整为给定参数的函数。它是一个通用的调整大小数组:
public static int[][] resize(int[][] source, int newWidth, int newHeight) {
int[][] newImage=new int[newWidth][newHeight];
double scale=newWidth/source.length;
for (int j=0;j<newHeight;j++)
for (int i=0;i<newWidth;i++)
newImage[i][j]=source[(int)(i/scale)][(int)(j/scale)];
return newImage;
上面的代码没有问题,它适用于整数调整大小。然而,当我使用resize函数将数组的大小调整为0.5时,问题就出现了。
int[][] newImage=new int[source.length][source.length];
newImage=resize(source,source.length/2,source[0].length/2);
return newImage;
然后一切都变得疯狂。我得到了类似2147483647的outofboundserrorexception。问题出在第一个函数中的double scale
变量和我在最后一行的第一个函数中使用的类型转换。任何修复的想法?
注意:source.length是数组的宽度(列),source [0] .length是高度(行)。
答案 0 :(得分:2)
scale
变量的类型为double
。您可能期望以下内容:
int newWidth = 5;
int sourceLength = 10;
double scale = newWidth / sourceLength;
// what is `scale` now?
令人惊讶的是,规模现在是0.0
。这是因为将int
除以int
总是会再次产生int
。
要获得您想要的结果,您必须写:
double scale = ((double) newWidth) / sourceLength;
或
double scale = 1.0 * newWidth / sourceLength;
然后使用double
和int
进行除法,结果将是double
,在这种情况下是预期的0.5
。
答案 1 :(得分:1)
说明:
肮脏的修复:
double scale = ((double)newWidth) / source.length;
该代码效率不高,因为它在双精度和整数之间不断转换。您可以通过执行以下操作来坚持使用:
newImage[i][j]=source[i * source.length / newWidth][j * source.length / newWidth];
如果newWidth * source.length&gt;该解决方案会溢出Integer.MAX_VALUE但我怀疑你不会使用那么大的矩阵。
答案 2 :(得分:0)
奇怪的是,这有效:
String[] sArray = new String[10];
sArray[0] = "Zero";
sArray[1] = null;
sArray[2] = "Two";
sArray[3] = "Three";
sArray[4] = null;
sArray[5] = "Five";
sArray[6] = "Six";
sArray[7] = null;
sArray[8] = null;
sArray[9] = null;
assertTrue(sArray.length == 10); // part of JUnit - not needed for program
for (int i = sArray.length - 1; i > -1; i--) {
if (sArray[i] == null ) {
// has nothing to do with the array element #
sArray = ((String[]) ArrayUtils.removeElement(sArray, null));
}
}
assertTrue(sArray.length == 5); // part of JUnit - not needed for program
诀窍在于指定null作为removeElement调用中的第二个参数。根本不直观!我希望传递我想要删除的数组元素,但这并没有改变数组的大小。如果要执行多个条件,请将它们放在if语句中,然后在调用removeElement之前将该数组元素置空。
示例:
// any of these conditions will cause the array element to be removed.
if ((sArray[i] == null ) || ( sArray[i].equals("") ) || ( sArray[i].equals("deleteMe")) ) {
sArray[i] = null;
sArray = ((String[]) ArrayUtils.removeElement(sArray, null));
}
任何人都有这方面的其他见解,为什么它会这样,以及为什么我从未见过它,虽然我已多次搜索过!!!!