在 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/