将特定索引处的数组值复制到另一个数组

时间:2014-11-27 11:20:06

标签: java arrays

我遇到了一个我有数组的情况,我需要将一些特定属性(即特定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]];
}

3 个答案:

答案 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(),但我不知道方法调用的确是多么昂贵。