【问题标题】:How to create a sub array from another array in Java?如何从 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);
    }
}

【问题讨论】:

    标签: java arrays


    【解决方案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); 
    

    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 的目的:)
              猜你喜欢
              • 1970-01-01
              • 2017-05-16
              • 2012-12-16
              • 2017-05-06
              • 2013-08-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多