通过java中的数组索引数组

时间:2014-11-17 14:05:03

标签: java arrays

在R中你可以这样做:

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

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

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

2 个答案:

答案 0 :(得分:3)

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

对于通用数组,您需要使用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]

答案 1 :(得分:0)

相关问题