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

在Java中,有没有一种方法可以将数组分配给数组的切片,java,Java,在Python中,可以获得列表的视图并为其分配不同的列表。在Java中可能吗 例如,在Python中,我会这样做 a=[1,2,3,4,5] a[2:4]=[1,1] 可以对Java数组执行类似的操作吗?是和否。在Java中,就像在C中一样,数组是连续内存的一部分。如果要对它们进行写入,必须显式设置感兴趣的元素。这通常意味着写一个循环。Python当然也做了同样的事情,但它隐藏了循环,所以您不必每次都写出它 也就是说,当您将段从一个数组复制到另一个数组时,Java确实有一种隐藏循环的方法:。所

在Python中,可以获得列表的视图并为其分配不同的列表。在Java中可能吗

例如,在Python中,我会这样做

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

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

是和否。在Java中,就像在C中一样,数组是连续内存的一部分。如果要对它们进行写入,必须显式设置感兴趣的元素。这通常意味着写一个循环。Python当然也做了同样的事情,但它隐藏了循环,所以您不必每次都写出它

也就是说,当您将段从一个数组复制到另一个数组时,Java确实有一种隐藏循环的方法:。所以你可以做一些像

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]
没有获取视图并分配给它。它使用
a
上的
slice
对象调用
\uuuuuuu setitem\uuuuuuu
。这有很大的区别,特别是对于像
列表
这样没有视图的对象。

以下是解决问题的一般解决方案:

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

不是重复:另一篇文章是检索数组,这是赋值。你能向我(Java用户)澄清一下,预期的结果是什么吗?@YCF_L。代码将
a
的元素2(包括)到4(不包括)设置到位。python的结果不应该是[1,2,1,1,5]吗?为什么会是这样?编辑:什么?@YCF_L.谁说过它不是,为什么这一点都不相关?@YCF_L.您正在设置
a
,但正在打印
b
。你期待什么?python代码修改了
a
,我的代码也是如此。我不确定你的意思。@YCF\L两种方法都是正确的。您的示例采用了第一个示例的一部分,然后是第二个示例的一部分,然后打印了错误的数组。这并不像python代码那样在
a
中进行赋值。还有,你不认为为所有内容制作临时副本和流有点过分吗?@Mad Physical你有其他想法吗?@Mad Physical你的解决方案不完整,在很多情况下可能失败,因为我创建了这个通用解决方案,对于你的解决方案,你可以使用b=[1,2,3,4]进行测试,并用Python检查结果,您必须在Java中使用合理的输入。我的代码片段并不是泛化的,它是为了回答OP的问题。