首页 文章

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

提问于
浏览
250

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

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

9 回答

  • 1

    代码是正确的,所以我猜你使用的是较旧的JDK . 该方法的javadoc说它从1.6开始就存在 . 在命令行类型:

    java -version
    

    我猜你没有运行1.6

  • 2

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

  • 29

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

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

    “boolean”只是一个例子,有所有原语java类型的方法

  • 4
    int newArrayLength = 30; 
    
    int[] newArray = new int[newArrayLength];
    
    System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);
    
  • 3

    您可以使用

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

    Javadoc

  • 20

    在Java 1.6中添加了 Arrays.copyOfRange(..) . 所以也许你不能升级,请看 System.arraycopy(..)

  • 255

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

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

    更多细节:

    Link to similar question

  • 133

    是的,它被称为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
    
  • 0

    我同意上面的所有答案 . 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();
    

相关问题