我有一个方法,它接受一个字符串数组,并根据长度查找每个项目的平均值。我希望该方法根据offset的值删除数组中的前几个项目。
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 []转换为double []
答案 0 :(得分:6)
数组在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]
答案 1 :(得分:2)
来自Java 6 API
public static double [] copyOfRange(double [] original, int来自, int to)
复制指定的范围 将指定的数组转换为新数组。该 范围的初始索引(from)必须 介于零和original.length之间, 包括的。原始值[来自] 放在初始元素中 副本(除非来自== original.length或from == to)。值 从后来的元素 原始数组被放入 副本中的后续元素。该 范围的最终索引(to),其中 必须大于或等于, 可能大于original.length, 在这种情况下,0d放在所有 索引为的副本的元素 大于或等于 original.length - 来自。的长度 返回的数组将是 - from。
参数:original - 来自的数组 从哪个范围复制 - 范围的初始索引 复制,包括 - 最终索引 要复制的范围,独占。 (这个指数可能在...之外 数组。)
返回:一个新数组 包含指定范围 原始数组,截断或 用零填充以获得 所需长度
抛出: ArrayIndexOutOfBoundsException - 如果 来自&lt; 0或来自&gt; original.length() IllegalArgumentException - 如果来自&gt; 到NullPointerException - 如果是原始的 是null因为: 1.6
答案 2 :(得分:2)
而不是删除项目,为什么不只是创建一个较小尺寸的新列表作为输出,并始终使用index-offset作为其索引?
答案 3 :(得分:1)
也许其中一个Arrays.copyOfRange()方法会做什么?
http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOfRange(boolean[], int, int)
答案 4 :(得分:1)
您无法从数组中显式删除,但您可以使用其他数据结构(如ArrayList)来累积结果。但是,在您的情况下,您可能只想更改代码以正确调整数组大小,即。
double[] movingAverage = new double[listLength-offset];
和
for (int aa = 0; aa < listLength-offset; aa++){
答案 5 :(得分:1)
为了防止复制数组,可以使用像LinkedList这样的集合类,它从头部删除操作。
http://download.oracle.com/javase/6/docs/api/java/util/LinkedList.html