我遇到了一个我有数组的情况,我需要将一些特定属性(即特定indinces的值)复制到另一个数组而不是整个数组。
例如,如果初始数组是:
double[] initArray = {1.0, 2.0, 1.5, 5.0, 4.5};
然后,如果我只想复制第2,第4和第5个属性(即这些索引处的值),那么所需的输出数组将是:
double[] reducedArray = {2.0, 5.0, 4.5};
我知道如果索引以顺序形式出现,例如1-3然后我可以使用System.arraycopy()
但我的索引没有那个方面。
那么,有没有任何官方方法可以做到这一点,除了通过每个值的简单循环并复制所需的那些:
double[] includedAttributes = {1, 4, 5};
double[] reducedArray = new double[includedAttributes.length];
for(int j = 0; j < includedAttributes.length; j++) {
reducedArray[j] = initArray[includedAttributes[j]];
}
答案 0 :(得分:2)
使用溪流,它是一个单行。
假设:
int[] indices;
double[] source;
然后:
double[] result = Arrays.stream(indices).mapToDouble(i -> source[i]).toArray();
答案 1 :(得分:0)
简单地说,除非你有特定的案例,否则它是不可能的。
例如:
您希望前N个项目具有最高价值(在您的情况下为{2.0,4.5,5.0})
快速(和肮脏)的方式:
public static double[] topvalues(int n,double[] original){
double[] output=new double[n];
Arrays.sort(original);
System.arraycopy(original,0,output,0,n);
return output;
}
注意:此方法也会对原始数组进行排序。如果您不想要这种行为,可以使用不同的方法,here是一个列表:
答案 2 :(得分:0)
以一种可能不受欢迎的方式回答你的问题,你可以写一个类来进行这种操作:
public class PointerArray <T> {
private T[] arr;
private int[] indices;
public PointerArray(T[] arr, int[] indices) {
this.arr = arr;
this.indices = indices;
}
public T get(int index) {
return this.arr[this.indices[index]];
}
public void set(int index, T value) {
this.arr[this.indices[index]] = value;
}
public int size() {
return this.indices.length;
}
}
这是未经测试的代码,但这个想法至少应该通过。
使用它看起来像这样:
int[] includedAttributes = {0, 3, 4};
PointerArray<Double> reducedArray =
new PointerArray<Double>(initArray, includedAttributes);
for(int j = 0; j < reducedArray.size(); j++) {
System.out.println(reducedArray.get(j));
}
这是性能和内存方面,我认为是一个很好的解决方案,因为没有任何东西被复制(也没有创建)。唯一的缺点是需要调用get()
,但我不知道方法调用的确是多么昂贵。