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


284

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

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);
    }
}

Answers:


305

您可以使用

JDK> 1.5

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

Java文档

JDK <= 1.5

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

Java文档


3
我在Arrays.copyOfRange中没有Object []时遇到了一些问题。检查您的导入,以确保您正在使用java.util.Arrays。不知何故导入了其他版本的Arrays,我浪费了15分钟检查JRE和JDK的问题。
NuclearPeon

@NuclearPeon谢谢!!!在我自己弄清楚它之前,要花我很长时间。Eclipse自动导入org.bouncycastle.util.Arrays
anddero '17

136

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



4
您的JDK来自哪个供应商。Sun / Oracle从未发布版本4.00.28,而google也找不到它。
彼得·劳瑞

如果尾随元素不在源数组范围之内,则copyOfRange会将它们设为空,而不是分配较小的数组:(
Daneel S. Yaitskov

12
应该有人在回答补充一点,而“创业指数”是包容性的,“最终指数” 独家
燕景贤

@ YanKingYin你是正确的-这正是我在阅读的评论:)
Ben Kushigian


20

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

尽管如此,它仍然会在某个地方执行循环,除非可以REP STOSW通过JIT 优化这种循环(在这种情况下,循环位于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


6

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();

3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

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

2

该代码是正确的,所以我猜您正在使用较旧的JDK。该方法的javadoc说它从1.6开始就已经存在。在命令行中输入:

java -version

我猜你不是在运行1.6


1

我使用的是Java,System.arraycopy()而不是1.6版之前的版本。或升级您的环境。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.