Java调整数组大小

时间:2010-10-09 23:12:22

标签: java arrays

我想编写一个将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是高度(行)。

3 个答案:

答案 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;

然后使用doubleint进行除法,结果将是double,在这种情况下是预期的0.5

答案 1 :(得分:1)

说明:

  1. 表达式1/2是整数除法。它产生0.
  2. 将0分配给double会将其变为0.0
  3. 1 / 0.0是浮点除法,产生Double.POSITIVE_INFINITY。
  4. 将Double.POSITIVE_INFINITY转换为int会产生Integer.MAX_VALUE。
  5. 肮脏的修复:

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

任何人都有这方面的其他见解,为什么它会这样,以及为什么我从未见过它,虽然我已多次搜索过!!!!