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

Gai*_*ain 273 java arrays

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

methodName(object array, int start, int end)
Run Code Online (Sandbox Code Playgroud)

我不想过去制作循环并让我的程序受损.

我一直收到错误:

找不到符号方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jig*_*shi 293

您可以使用

JDK> 1.5

Arrays.copyOfRange(Object[] src, int from, int to)
Run Code Online (Sandbox Code Playgroud)

的Javadoc

JDK <= 1.5

System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 
Run Code Online (Sandbox Code Playgroud)

的Javadoc

  • 我在Arrays.copyOfRange中遇到了一些没有Object []的问题.检查导入以确保使用java.util.Arrays.不知何故,一个不同的Arrays版本被导入了,我浪费了15分钟检查JRE和JDK的问题. (3认同)

Boz*_*zho 135

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

  • 有人应该在答案中加入"start-index"是包容性的,"end-index"是*exclusive* (10认同)
  • 哪个供应商是您的JDK.Sun/Oracle从未发布过版本4.00.28,谷歌也找不到它. (4认同)

小智 41

使用java.util.Arrays类中的copyOfRange方法:

int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);

更多细节:

链接到类似的问题


Ger*_*ies 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
Run Code Online (Sandbox Code Playgroud)


ena*_*tor 11

JDK >= 1.8

我同意上面的所有答案。Java 8 Streams 还有一个很好的方法:

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

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

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

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

  • 使用流是个好主意。还可以使用 Stream.of(source).skip(start).limit(count).toArray(Foo[]::new)`。 (6认同)

Ale*_*zzi 6

使用可从此链接下载的Apache ArrayUtils,可以轻松使用该方法

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 
Run Code Online (Sandbox Code Playgroud)

“布尔值”仅是示例,对于所有基本类型的Java类型都有方法