如何从字符串数组中删除前几项



我有一个方法,它接受一个字符串数组,并根据长度每隔几项找到平均值。我希望该方法根据偏移量的值删除数组中的前几项。

public static double[] getMovingAverage(String[] priceList, int length, int offset){
    double[] newPriceList = convert(priceList);
    int listLength = newPriceList.length;
    int counter = 0;
    double listsum;
    double[] movingAverage = new double[listLength];
    try{
        for (int aa = 0; aa < listLength-1; aa++){
            listsum = 0;
            for (int bb = 0; bb < length; bb++){
                counter = aa+bb;
                listsum = listsum + newPriceList[counter];
            }
            movingAverage[aa] = listsum / length;
        }
        if (offset>0){
                        //remove first #offset# elements
        }
    }catch(Exception e){
        System.out.println(e);
    }
    return movingAverage;
}

*注意:convert();将String[]转换为双[]

数组在Java中是固定长度的。(你不能改变数组的长度。)

然而,您可以很容易地创建一个新的数组,其中第一个offset元素被删除:

double[] movingAverage = { 0.1, 0.2, 1.1, 1.2 };
int offset = 2;
// print before
System.out.println(Arrays.toString(movingAverage));
// remove first offset elements
movingAverage = Arrays.copyOfRange(movingAverage, offset, movingAverage.length);
// print after
System.out.println(Arrays.toString(movingAverage));

输出:

[0.1, 0.2, 1.1, 1.2]
[1.1, 1.2]

来自Java 6 API

公共静态双[]copyOfRange(双[]原稿,int from,int到)

复制的指定范围指定的数组转换为新数组。这个范围(从)的初始索引必须位于零和原始长度之间,包含全部费用原始值[from]被放置到的初始元素中副本(除非来自==original.length或from==to)。价值观中的后续元素原始数组被放入副本中的后续元素。这个范围(到)的最终索引必须大于或等于from,可以大于原始长度,在这种情况下,0d被放在所有索引为的副本的元素大于或等于original.length-起始。的长度返回的数组将是to-from。

参数:original-来自的数组要从中复制范围-范围的初始索引已复制,包含到-最终索引要复制的范围的,独占。(此索引可能位于数组。)

返回:一个新数组包含从原始数组,截断或用零填充以获得要求长度

投掷:ArrayIndexOutOfBoundsException-if从<0或from>original.length()IllegalArgumentException-如果来自>到NullPointerException-如果是原始的为null,因为:1.6

与其删除项目,为什么不创建一个较小大小的新列表作为输出,并始终使用索引偏移量作为其中的索引?

也许其中一个Arrays.copyOfRange()方法就可以了?

http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOfRange(boolean[],int,int)

您不能从数组中显式删除,但可以使用其他数据结构,如ArrayList,来累积结果。不过,在您的情况下,您可能只想更改代码以正确调整阵列的大小,即

 double[] movingAverage = new double[listLength-offset];

    for (int aa = 0; aa < listLength-offset; aa++){

为了防止数组的复制,可以使用像LinkedList这样的集合类,该类的头部有O(1)remove操作。

http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html

最新更新