Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-将ArrayList限制为仅250位_Java_Arraylist - Fatal编程技术网

Java-将ArrayList限制为仅250位

Java-将ArrayList限制为仅250位,java,arraylist,Java,Arraylist,我有一个使用ArrayList存储时间戳的项目。使用此ArrayList,我计算车库内每辆车的平均停车时间。如果我运行我的项目5分钟,那么这个特定的ArrayList已经加载了大约10000个不同的时间戳。因此,我想将整个ArrayList限制为仅250,以防止其过载。如果ArrayList具有一定的大小,则循环遍历它需要花费很长时间。它需要将新的时间推送到ArrayList,但删除旧的时间,以便仍然能够计算平均时间。我怎样才能做到这一点 阵列列表 private ArrayList times

我有一个使用ArrayList存储时间戳的项目。使用此ArrayList,我计算车库内每辆车的平均停车时间。如果我运行我的项目5分钟,那么这个特定的ArrayList已经加载了大约10000个不同的时间戳。因此,我想将整个ArrayList限制为仅250,以防止其过载。如果ArrayList具有一定的大小,则循环遍历它需要花费很长时间。它需要将新的时间推送到ArrayList,但删除旧的时间,以便仍然能够计算平均时间。我怎样才能做到这一点

阵列列表

private ArrayList times=new ArrayList();
将时间添加到ArrayList

private void carsPaying(){
//让汽车支付。
总浮点数=0.0f;
int i=0;
while(paymentCarQueue.carsInQueue()>0&&i
计算平均时间

public BigDecimal getAverageTime(){
浮动总时间=0.0f;
for(浮动时间:次){
总时间+=时间;
}
浮动平均值=总时间/次数.size();
平均值=平均值/60;
整小时=(整小时)平均值;
分钟数=(分钟)(60*(平均小时));
浮动时间1=(浮动)分钟/100;
浮动时间段2=小时+时间段1;
返回轮(temp2,2);
}

提前谢谢

我建议这样的策略

Queue times=new ArrayDeque();
最终静态int MAX_SIZE=250;
公共无效添加时间(浮动时间){
如果(times.size()==MAX_size)乘以.poll();
时间。添加(时间);
}
//继续您的平均计算时间队列将有史以来的最大大小
//得到的是250

如果您想使用番石榴,那么可以使用名为executingqueue的类,请参见。它不是一个列表,但它是可实现的,这意味着您可以轻松地在其中搜索。

如果元素的数量是固定的,您应该使用数组。使用模运算符很容易覆盖最旧的元素,如下所示:

private static final int MAX_SIZE = 250;
private float[] times = new float[MAX_SIZE];

private void carsPaying() {
        // ...
        while (paymentCarQueue.carsInQueue() > 0 && i < Car.getPaymentSpeed()) {
            // ...
            times[i % MAX_SIZE] = timeInFloat;
            i++;
        }
}
private static final int MAX_SIZE=250;
私有浮动[]次=新浮动[最大大小];
私家车{
// ...
while(paymentCarQueue.carsInQueue()>0&&i
您可以使用
add(int index,E element)
而不是
add(E element)
并将计数器重新初始化为
0
以保留较新的元素:

int i = 0;
while (paymentCarQueue.carsInQueue()>0 && i < Car.getPaymentSpeed()){
    // ...
    float timeInFloat = car.getTotalMinutes();
    times.add(i, timeInFloat);
    i++;
    if (i == MAX_TIMES-1) { i = 0 };
}

是否要在数据达到250后从
ArrayList
删除旧数据?如果可能,是否要删除?如果有意义,只让较新的版本进入,那么它仍然会更新?您使用的是
float
货币值。不要这样做。这仍然会让较新的时间出现在队列中?因此,如果队列已满,我在队列中推一个新时间,这个时间将被忽略?或者也被推到队列中,另一个将被删除?它将丢弃第一次插入的时间,即最长的时间,并将您的新时间插入到队列的末尾。仅仅为了简单的功能,可以通过正常的
队列
和一点逻辑来轻松实现,拉取所有的番石榴真的是一个好主意吗?我宁愿不这样做编写别人可能写得更好的代码;我使用ApacheCommons进行字符串操作,使用ApacheIO进行普通IO操作。当您使用多个工具进行构建时,如果您愿意的话,您可以剪切掉非必需的代码。这取决于你是否认为自己比我认为的其他人更好;我是一个有缺陷的人:)我并不是说我能写出比已经提供的库更好的代码,已经存在的代码已经过测试并被成千上万的开发人员使用过,所以这里没有问题,我只是提到了一个事实,那就是拉一个完整的库(在这种情况下,
guava
)可能有点过头了您只需使用jdk提供的功能即可实现以下目标:)
LinkedList<Float> times = new LinkedList<>();
//...
while (paymentCarQueue.carsInQueue()>0 && i < Car.getPaymentSpeed()){
    // ...
    float timeInFloat = car.getTotalMinutes();
    if (times.size() == MAX_TIMES-1) { times.removeFirst()};
    times.addLast(timeInFloat);

}