在Python中,可以获取列表视图并为其分配其他列表。 Java可能吗?
例如,在Python中我会做
a = [1, 2, 3, 4, 5]
a[2:4] = [1, 1]
是否可以对Java数组执行类似的操作?
答案 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