如何从 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);
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数据帧中的另一列?
C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组