有没有一种方法可以将数组分配给Java中的数组切片

时间:2019-06-10 20:32:10

标签: java

在Python中,可以获取列表视图并为其分配其他列表。 Java可能吗?

例如,在Python中我会做

a = [1, 2, 3, 4, 5]
a[2:4] = [1, 1]

是否可以对Java数组执行类似的操作?

2 个答案:

答案 0 :(得分:6)

是,不是。在Java中,就像在C中一样,数组是连续的内存。如果要写给他们,则必须显式设置您感兴趣的元素。这通常意味着编写循环。 Python当然也做同样的事情,但是它隐藏了循环,因此您不必每次都写出来。

话虽这么说,当您将段从一个数组复制到另一个数组中时,Java确实有一种隐藏循环的方法:System.arraycopy。所以你可以做类似的事情

int[] a = new int[] {1, 2, 3, 4, 5};
int[] b = new int[] {1, 1};
System.arraycopy(b, 0, a, 2, 2);

一个更好的近似原图可能是

int[] a = new int[] {1, 2, 3, 4, 5};
System.arraycopy(new int[] {1, 1}, 0, a, 2, 2);

顺便说一句,python标记a[2:4] = [1, 1]并没有获得视图并分配给它。它使用__setitem__上的slice对象调用a。有很大的不同,尤其是对于list这样的没有视图的对象。

答案 1 :(得分:1)

这是解决您遇到的问题的通用解决方案:

public int[] setItemJavaCode(int[] a, int[] b, int startIndex, int endIndex) {
    int[] start = Arrays.copyOfRange(a, 0, startIndex);
    int[] end = Arrays.copyOfRange(a, endIndex, a.length);
    return IntStream.concat(
            Arrays.stream(start), IntStream.concat(Arrays.stream(b), Arrays.stream(end))
    ).toArray();
}

说明

a = [1, 2, 3, 4, 5]__> int[] a
a[2:4] = [1, 1]
  ^ ^    ^^^^^^______> int[] b
  | |
  | |________________> endIndex
  |__________________> startIndex