java - java中通过数组索引数组

标签 java arrays

在 R 中你可以做这样的事情:

> x = c(1, 222, 333, 4, 5)
> x[c(2, 3)]
[1] 222 333
行首的

> 只是交互式 session 中的提示。 x 是一个数值 vector ,如果您想要 x 的第二个和第三个元素,您可以将另一个 vector c(2, 3) 传递给索引 x。这与java中的Arrays.copyOfRange不同:你可以将任意索引 vector 传递给x,不一定是连续范围,即x[c(1,3,5)]

我想知道java中是否有类似的功能。

最佳答案

据我理解您的问题,您可以创建一个将索引列表作为参数的方法。

对于通用数组,您需要使用 Array.newInstance 并将结果数组转换为 T[] (感谢 @Radiodef 指出这一点)

//for lists
static <T> List<T> buildList(List<T> original, int... indexes){
    List<T> finalList = new ArrayList<>();
    for(int index : indexes){
        finalList.add(original.get(index));
    }
    return finalList;
}

//for arrays
static <T> T[] buildArray (T[] original, int... indexes){       
    @SuppressWarnings("unchecked")
    T[] finalArray = (T[])Array.newInstance(original.getClass().getComponentType(), indexes.length);
    for(int i = 0; i < indexes.length; i++){
        finalArray[i] = original[indexes[i]];
    }
    return finalArray;
}

一些注释:

  • 对于原始数组(如 int[]double[]),您必须重载这些方法,这就是为什么我建议您使用 List 改为使用泛型。
  • Java 中数组的索引从 0 开始(从 0 开始到 length-1)
  • 不要忘记为方法添加额外的检查(有效索引、原始列表或索引不为空)
  • 如果您使用 LinkedList 而不是 ArrayList,请注意 #get(int index) 是一个 O(n) 运算而不是 O(1)

使用示例:

public static void main(String[] args) {
    Integer[] xArray = {-1, 10, 24, 7};
    List<Integer> xList = Arrays.asList(-1, 10, 24, 7);

    System.out.println(Arrays.toString(buildArray(xArray, 0, 2)));
    System.out.println(buildList(xList, 0, 1, 3));
}

哪些输出:

[-1, 24]
[-1, 10, 7]

关于java - java中通过数组索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974448/

相关文章:

java - Tomcat 7 : avoid automatic restart when change context. xml

java - 使用计划任务时出现文件未找到错误

java - 二维长数组向值附加一个额外的零

java - 通过java套接字使用HTTP协议(protocol)上传文件

php - 如果 VAR 在 mySQL 数据库中,则返回该行数据作为变量 PHP

不能交换数组 [2][2] 中的行。似乎它做了一些超出数组的事情

javascript - 上一节完成后显示下一个容器

java - SonarQube 错误 : Refactor this method to throw at most one checked exception

C++:使用指向数组的指针

arrays - 在 Swift 数组上使用 didSet 和 private(set)