接《Java中的排列组合(一)》

方法int[] delete(int[] a, int i)将数组a中下标为i的元素删除,产生一个新的数组返回。因为在方法permutation中我们要反复使用数组a,所以数组a的内容不能改变,我们这个delete方法并没有改变数组a的内容,这与它的名称有点不相符。

代码如下:

 /** 

     * @param a 数组

     * @param i 将要删除的元素的下标

     * @return 数组a去除下标为i的元素之后产生的新数组

     */

    public static int[] delete(int[] a, int i) {

        assert a.length > 0 : "数组不能为空!";

int[] b = new int[a.length - 1]; // 初始化数组b,长度为a.length - 1

for (int j = 0, k = 0; k < a.length; k++) {

if (k == i) {

continue;

}

b[j] = a[k];

j++;

}

return b;

    }

方法void matrixCopy(int[][] src, int srcRowPoc, int srcColPoc, int[][] dest, int destRowPoc, int destColPoc)从二维数组src中第srcRowPoc行第srcColPoc列开始将剩余元素复制到二维数组dest中, dest从第destRowPoc行第destColPoc列开始接收数据。

代码如下:

public static void matrixCopy(int[][] src, int srcRowPoc, int srcColPoc, int[][] dest, int destRowPoc, int destColPoc) {

        for (int i = 0; srcRowPoc + i < src.length && destRowPoc + i < dest.length ; i++) {

            for (int j = 0; srcColPoc + j < src[i].length && destColPoc + j < dest[j].length; j++) {

                dest[destRowPoc + i][destColPoc + j] = src[srcRowPoc + i][srcColPoc + j];

            }

        }

    }

至此,排列问题就基本解决了。下面我们再写一个方法,用来打印二维数组。

public static void printMatrix(int[][] a) {

        for (int[] x : a) {

            System.out.println(Arrays.toString(x));

        }

    }

组合的问题,明天再说。