Для 200 строк, вероятно, не имеет значения, какое решение вы выберете.Но если вам нужно решение, которое масштабируется до очень длинного списка, правильным подходом является zip
два списка (или потока) вместе (таким образом вы избегаете циклического повторения дважды) и использование функции для получения комбинированного результата.Сам Guava предоставляет метод zip () , но вы также можете написать свой собственный.
Не уверен, что вы подразумеваете под «количеством транспортных средств в очереди», но я собираюсь предположить, что вы хотите знать, сколько осталось в конце, которые еще не были допущены.
Вы можете создать свой собственный класс, который отображает транспортные средства, прибывающие с повесткой дня на эту дату.
public class VehiclePlanningData {
private final Vehicle vehicle;
private final Planning planning;
public VehiclePlanningData(Vehicle vehicle, Planning planning) {
this.vehicle = vehicle;
this.planning = planning;
}
public Vehicle getVehicle() {
return vehicle;
}
public Planning getPlanning() {
return planning;
}
}
Получив это, вы можете легко выполнить операцию reduce()
для переноса любогоавтомобили остались от предыдущего слота.
Итак, что-то вроде этого (с использованием класса потоков Guava):
int queue = Streams.zip(vehicles.stream(), planning.stream(), (v, p) -> new VehiclePlanningData(v, p))
.reduce(0, (queue, nextSlot) ->
queue + (nextSlot.getVehicle().getNbOfVehicleArriving()
- nextSlot.getPlanning().getNbOfallowedVehicles(),
(q1, q2) -> q1 + q2);
ОБНОВЛЕНИЕ:
Кажется, что очередь находится на временной интервал.В этом случае вам может понадобиться специальный класс, такой как этот, который хранит размер очереди на слот:
public class TimeslotQueue {
private final Date date;
private final int queueSize;
public VehicleQueue(Date date, int queueSize) {
this.date = date;
this.queueSize = queueSize;
}
public Date getDate() {
return date;
}
public int getQueueSize() {
return queueSize;
}
}
Затем получите поток этих классов, например:
List<TimeslotQueue> queues = Streams.zip(vehicles.stream(), planning.stream(),
(v, p) -> new TimeslotQueue(v.getDate(),
v.getNbOfVehicleArriving() - p.getNbOfallowedVehicles()))
.collect(Collectors.toList());
Таким образом, у вас есть список транспортных средств в очереди на каждую дату.В качестве примечания я бы использовал Java 8 LocalDateTime
, а не старый Date
класс.