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

4

我是一名有用的助手,可以为您进行文本翻译。

我遇到了这样一种情况:我有一个数组,我需要将某些特定属性(即特定索引处的值)而不是整个数组复制到另一个数组中。

例如,如果初始数组为:

double[] initArray = {1.0, 2.0, 1.5, 5.0, 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]];
}

使用ArrayList是否有任何限制?例如,您可以拥有一个ArrayList<Double> temp,然后只需将所有所需的数字添加到其中。最后,通过调用temp.toArray(new double[]{}),您可以获得double[]数组。当然,您也可以使用纯数组来实现这一点。这只是一种简单、简洁且易于操作的方法。 - Olavi Mustanoja
Java 8 Streams 可能是你正在寻找的东西。或者是 Pre-8? - Fildor
@OlaviMustanoja 虽然没有特定的限制,但我会选择 ArrayList,因为它支持自动装箱。 - Eypros
@Fildor 我正在使用Java 7,但无论如何了解这一点可能很有趣。 - Eypros
也许在这里看一下:https://dev59.com/ZWMl5IYBdhLWcg3wP1HE - Fildor
3个回答

2
使用流,只需一行代码即可完成。
给定:
int[] indices;
double[] source;

然后:

double[] result = Arrays.stream(indices).mapToDouble(i -> source[i]).toArray();

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;
}

注意:此方法也会对您的原始数组进行排序。如果您不希望出现这种行为,可以使用其他方法,在这里有一个列表:


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()方法,但我并不知道方法调用的代价有多大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接