为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Java中对2d数组进行深度复制?

如何在Java中对2d数组进行深度复制?

米脂 2019-06-20 15:48:23
如何在Java中对2d数组进行深度复制?我只是因为用.clone()在我的2dboolean认为这是一个很深的拷贝。如何执行boolean[][]阵列?我应该循环一下然后做一系列的System.arraycopy是什么?
查看完整描述

3 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

是的,您应该在2D布尔数组上进行迭代,以便深入复制它。也看看java.util.Arrays#copyOf方法,如果您在Java 6上。

我建议Java 6的下一个代码:

public static boolean[][] deepCopy(boolean[][] original) {
    if (original == null) {
        return null;
    }

    final boolean[][] result = new boolean[original.length][];
    for (int i = 0; i < original.length; i++) {
        result[i] = Arrays.copyOf(original[i], original[i].length);
        // For Java versions prior to Java 6 use the next:
        // System.arraycopy(original[i], 0, result[i], 0, original[i].length);
    }
    return result;}


查看完整回答
反对 回复 2019-06-20
?
忽然笑

TA贡献1806条经验 获得超5个赞

在Java 8中,可以使用lambdas作为一个一行来实现这一点:

<T> T[][] deepCopy(T[][] matrix) {
    return java.util.Arrays.stream(matrix).map(el -> el.clone()).toArray($ -> matrix.clone());}


查看完整回答
反对 回复 2019-06-20
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我已经想出了一个递归数组深度复制。即使对于具有不同尺寸长度的多维数组,它似乎也能很好地工作。

private static final int[][][] INT_3D_ARRAY = {
        {
                {1}
        },
        {
                {2, 3},
                {4, 5}
        },
        {
                {6, 7, 8},
                {9, 10, 11},
                {12, 13, 14}
        }};

这是实用方法。

@SuppressWarnings("unchecked")public static <T> T[] deepCopyOf(T[] array) {

    if (0 >= array.length) return array;

    return (T[]) deepCopyOf(
            array, 
            Array.newInstance(array[0].getClass(), array.length), 
            0);}private static Object deepCopyOf(Object array, Object copiedArray, int index) {

    if (index >= Array.getLength(array)) return copiedArray;

    Object element = Array.get(array, index);

    if (element.getClass().isArray()) {

        Array.set(copiedArray, index, deepCopyOf(
                element,
                Array.newInstance(
                        element.getClass().getComponentType(),
                        Array.getLength(element)),
                0));

    } else {

        Array.set(copiedArray, index, element);
    }

    return deepCopyOf(array, copiedArray, ++index);}

编辑:更新代码以处理基元数组。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 726 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信