Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆有限的多维空间_Java_Arrays - Fatal编程技术网

Java 克隆有限的多维空间

Java 克隆有限的多维空间,java,arrays,Java,Arrays,我有这个: String[][] numbers = { {"one", "two", "three"}, {"four", "five", "six"}, {"seven", "eight", "nine"} } String[][] tmp; 我现在要做的是将数字克隆到tmp中,但限制为每行2个参数。我不想初始化任何大小 tmp的输出: { {"one", "two"}, {"four", "five"},

我有这个:

String[][] numbers = {
     {"one", "two", "three"},
     {"four", "five", "six"},
     {"seven", "eight", "nine"}
}

String[][] tmp;

我现在要做的是将数字克隆到tmp中,但限制为每行2个参数。我不想初始化任何大小

tmp的输出:

{      
    {"one", "two"},         
    {"four", "five"},         
    {"seven", "eight"}
}
我尝试的是:

String[][] cloneArray(String[][] elements) {
    int length = elements.length;
    String[][] target = new String[length][2];
    for (int i = 0; i < length; i++) {
        System.arraycopy(elements[i], 0, target[i], 0, elements[i].length);
    }

    return target;
}

我得到
java.lang.ArrayIndexOutOfBoundsException

您对
System.arraycopy()
使用了错误的语法。方法的声明如下所示:

公共静态void数组副本(对象src、int-srcPos、对象dest、int-destPos、int-length)

其中,
src
dest
分别是源数组和目标数组。
arraycopy
函数本身处理从
srcPos
srcPos+length
的位置,并将其从
destPos
复制到
destPos+length
。因此,无需遍历元素并对每个元素使用
arraycopy()

因此,对于您的代码,修复将是:

String[][] cloneArray(String[][] elements) {
    int length = elements.length;
    String[][] target = new String[length][2];
    System.arraycopy(elements, 0, target, 0, elements.length);
    return target;
}
如果您不想使用
arraycopy
而是想循环元素并手动复制元素,您也可以简单地执行以下操作:

String[][] cloneArray(String[][] elements) {
    int length = elements.length;
    String[][] target = new String[length][2];
    for (int i = 0; i < length; i++) {
        for (int j = 0; j < 2; j++) {
            target[i][j] = elements[i][j];
        }
    }
    return target;
}
String[]]cloneArray(String[]]elements){
int length=elements.length;
字符串[][]目标=新字符串[长度][2];
for(int i=0;i
我们可以通过从第二个元素中获取
并在其上应用
流#映射
来过滤出第二个元素之外的内部数组,以便新内部数组的大小限制为2个元素:

String[][] numbers = {
                       {"one", "two", "three"},
                       {"four", "five", "six"},
                       {"seven", "eight", "nine"}
                     };
String[][] tmp = Arrays.stream(numbers)
                        .map(arr -> (arr != null && arr.length > 2)
                                         ? Arrays.copyOf(arr, 2) 
                                         : arr)
                       .toArray(String[][]::new);
System.out.println(Arrays.deepToString(tmp));
输出:

 [[one, two], [four, five], [seven, eight]]

“我不想初始化任何大小”-为什么不?您必须定义目标数组的大小(即限制为
2个
元素)。您的问题是什么?特别是:您当前的解决方案有什么问题?因为我有另一个功能,每次按下按钮时都会添加元素…因此我需要一个无限数组…我将编辑posti get java.lang.ArrayIndexOutOfBoundsException使用您的解决方案我不再获得java.lang.ArrayIndexOutOfBoundsException,但它不起作用…我有一个非常奇怪的想法output@RaylessTiKi请查看我的最新编辑,这应该有用。@RaylessTiKi很高兴它有用,如果你愿意,请接受我的回答。
 [[one, two], [four, five], [seven, eight]]