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

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

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);
}
}
482026 次浏览

你可以使用

JDK > 1.5

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

Javadoc

JDK <= 1.5

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

< a href = " http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html " > Javadoc < / >

是的,它被称为系统。arraycopy(对象,int,对象,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

Arrays.copyOfRange(..)是在Java 1.6中添加的。所以你可能没有最新的版本。如果不可能升级,查看System.arraycopy(..)

如果你在1.6版本之前使用java,请使用System.arraycopy()代替。或者升级您的环境。

int newArrayLength = 30;


int[] newArray = new int[newArrayLength];


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

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

java -version

我猜你不是在运行1.6

使用Apache ArrayUtils(可从这个链接下载),您可以轻松使用该方法

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

“布尔”只是一个例子,所有原语Java类型都有方法

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