如何从 Java 中的另一个数组创建子数组?

Posted

技术标签:

【中文标题】如何从 Java 中的另一个数组创建子数组?【英文标题】:How to create a sub array from another array in Java? 【发布时间】:2011-05-25 06:52:22 【问题描述】:

如何从另一个数组创建子数组?是否有一种方法可以从第一个数组中获取索引,例如:

methodName(object array, int start, int end)

我不想重复制作循环并让我的程序受到影响。

我不断收到错误:

找不到符号方法copyOfRange(int[],int,int)

这是我的代码:

import java.util.*;

public class testing 

    public static void main(String [] arg) 
       
        int[] src = new int[] 1, 2, 3, 4, 5; 
        int b1[] = Arrays.copyOfRange(src, 0, 2);
    

【问题讨论】:

【参考方案1】:

JDK >= 1.8

我同意以上所有答案。 Java 8 Streams 还有一个不错的方法:

int[] subArr = IntStream.range(startInclusive, endExclusive)
                        .map(i -> src[i])
                        .toArray();

这样做的好处是,它可以用于许多不同类型的“src”数组,并有助于改进流上的写入管道操作。

这个问题并不特别,但是例如,如果源数组是double[],而我们想取子数组的average()

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();

【讨论】:

使用流的好主意。也可以使用Stream.of(source).skip(start).limit(count).toArray(Foo[]::new)【参考方案2】:

你可以使用

JDK > 1.5

Arrays.copyOfRange(Object[] src, int from, int to)

Javadoc

JDK
System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 

Javadoc

【讨论】:

我的 Arrays.copyOfRange 中没有 Object[] 时遇到了一些问题。检查您的导入以确保您使用的是 java.util.Arrays。不知何故,导入了不同的 Arrays 版本,我浪费了 15 分钟检查 JRE 和 JDK 是否存在问题。 @NuclearPeon 谢谢!!!在我自己弄清楚之前,我会花很长时间。 Eclipse 自动导入org.bouncycastle.util.Arrays【参考方案3】:

使用 Apache ArrayUtils 可在this link 下载,您可以轻松使用该方法

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 

“boolean”只是一个例子,所有基本的java类型都有方法

【讨论】:

【参考方案4】:

是的,它叫System.arraycopy(Object, int, Object, int, int)。

它仍然会在某处执行循环,除非 JIT 可以将其优化为 REP STOSW 之类的东西(在这种情况下,循环在 CPU 内部)。

int[] src = new int[] 1, 2, 3, 4, 5;
int[] dst = new int[3];

System.arraycopy(src, 1, dst, 0, 3); // Copies 2, 3, 4 into dst

【讨论】:

【参考方案5】:
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);

【讨论】:

【参考方案6】:

代码是正确的,所以我猜您使用的是较旧的 JDK。该方法的 javadoc 说它自 1.6 以来一直存在。在命令行输入:

java -version

我猜你没有运行 1.6

【讨论】:

【参考方案7】:

如果您使用的是 1.6 版之前的 java,请改用 System.arraycopy()。或者升级您的环境。

【讨论】:

【参考方案8】:

Arrays.copyOfRange(..) 在 Java 1.6 中添加。所以也许你没有最新版本。如果无法升级,请查看System.arraycopy(..)

【讨论】:

@Sami 要么升级到 1.6,要么查看此文档以供参考 download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html 您的 JDK 来自哪个供应商。 Sun/Oracle 从未发布过 4.00.28 版本,谷歌也找不到。 copyOfRange 如果尾随元素超出源数组范围,则将其归零,而不是分配较小的数组:( 有人应该在答案中添加“start-index”是包容性的,“end-index”是exclusive @YanKingYin 你是对的——这正是我阅读 cmets 的目的:)

以上是关于如何从 Java 中的另一个数组创建子数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一列数组,其值来自一列并且它们的长度来自pyspark数据帧中的另一列?

如何用angular中的另一个数组的子对象创建一个数组

VueJs - 使用输入字段创建子组件的正确方法是啥

C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组

在java中,如何在int数组中为该数组中的另一个值添加值?

如何匹配 MongoDB 中的子文档数组?