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