在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中是否有类似的功能。
答案 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
。 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)