Java-将ArrayList限制为仅250位

时间:2019-02-01 18:18:47

标签: java arraylist

我有一个使用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);

    }

预先感谢

4 个答案:

答案 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