我有一个使用ArrayList来存储时间戳的项目。通过此ArrayList,我可以计算出车库中每辆车的平均停车时间。如果我将项目运行5分钟,则该特定ArrayList已经加载了大约10.000个不同的时间戳。因此,我想将整个ArrayList限制为仅250个,以防止其过载。如果ArrayList是某个大小,则需要花费很长时间来遍历它。它需要将新时间推送到ArrayList,但是删除旧时间,因此它仍然能够计算平均时间。我该如何实现?
ArrayList
private ArrayList<Float> times = new ArrayList<Float>();
将时间添加到ArrayList
private void carsPaying() {
// Let cars pay.
float total = 0.0f;
int i = 0;
while (paymentCarQueue.carsInQueue()>0 && i < Car.getPaymentSpeed()){
Car car = paymentCarQueue.removeCar();
if(currentDay != Time.getDay()) {
weeklyRevenue[Time.getDay()] = 0;
currentDay = Time.getDay();
}
// TODO Handle payment.
float payment = car.getTotalMinutes() * 0.042f;
weeklyRevenue[Time.getDay()] += payment;
revenue += payment;
carLeavesSpot(car);
numberOfParkedCars--;
numberOfCarsLeft++;
float timeInFloat = car.getTotalMinutes();
times.add(timeInFloat);
i++;
}
System.out.println(total);
}
计算平均时间
public BigDecimal getAverageTime() {
float totalTime = 0.0f;
for(Float time : times) {
totalTime += time;
}
float average = totalTime / times.size();
average = average / 60;
int hour = (int) average;
int minuut = (int) (60 * (average - hour));
float temp1 = (float) minuut / 100;
float temp2 = hour + temp1;
return round(temp2, 2);
}
预先感谢
答案 0 :(得分:2)
如果元素数量固定,则应使用数组。使用模运算符可以很容易地覆盖最旧的元素,如下所示:
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++;
}
}
答案 1 :(得分:1)
我会建议这样的策略
Queue<Float> times = new ArrayDeque<>();
final static int MAX_SIZE = 250;
public void addTime(float time) {
if(times.size() == MAX_SIZE) times.poll();
times.add(time);
}
// continue your average calculation the maximum size the times queue will ever
// get is 250
答案 2 :(得分:1)
如果要使用番石榴,则可以使用名为EvictingQueue的类,请参见https://google.github.io/guava/releases/22.0/api/docs/index.html?com/google/common/collect/EvictingQueue.html。它不是一个列表,但确实具有可重复性,这意味着您可以轻松地对其进行搜索。
答案 3 :(得分:0)
您可以使用res_UN = UN_ %>% group_by(country, year) %>% summarise(UN = sum(UN, na.rm = T))`
res_UN$sector = 'Residual'
UN_ = bind_rows(UN_, res_UN) %>% arrange(country, year, sector)
而不是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 };
}
用作Queue
是很可能的,因为在它的开始或结尾添加或删除足够便宜。
例如,通过增加时间来维护元素:
LinkedList