Java 计算两个 ArrayList 或 HashMap 的队列



我有 2 个类:1 表示到达 一定的时间,第二个实际计划与数量 允许车辆通过。输入数据如下所示:

Vehicle Arriving(在此列表上循环,因为计划可能会错过某些值(

01/01/2018 00:00:00 12
01/01/2018 00:10:00 10
01/01/2018 01:00:00 5
01/01/2018 01:10:00 10

Planning(基于时间戳的最后一个计划是要采取的计划(

01/01/2018 00:00:00 2
01/01/2018 00:10:00  4
01/01/2018 01:00:00 6

我想实现的是拥有另一个带有关键日期(或日期时间(和队列中车辆数量的类或哈希图。

在我们的示例中:

01/01/2018 00:00:00 | 12-2=10
01/01/2018 00:10:00 | 10-4+10(previous) =16
01/01/2018 01:00:00 | 5-6+16
01/01/2018 01:10:00 | 10-6(last value if planning not found)+15

我的类实现

class Vehicle {
private Date date;
private int nbOfVehicleArriving;
public Vehicle(Date date, int nbOfVehicleArriving) {
this.date = date;
this.nbOfVehicleArriving = nbOfVehicleArriving;
}
public int getNbOfVehicleArriving() {
return nbOfVehicleArriving;
}
}

class Planning {
private Date date;
private int nbOfallowedVehicles;
public Planning(Date date, int nbOfallowedVehicles) {
this.date = date;
this.nbOfallowedVehicles = nbOfallowedVehicles;
}
public int getNbOfallowedVehicles() {
return nbOfallowedVehicles;
}
}
class Queue {
private Date date;
private int nbOfVehiclesInQueue;

提前非常感谢。

我蹩脚的尝试:

if (planningList != null && vehiclesList != null) {
queues1 = new ArrayList<>();
int j = 0;
long count = 0;
for (int i = 0; i < planningList.size() - 1; i++) {
Date nextTime = planningList.get(i + 1).getTimestamp();
Integer nbOfVehiclesAllowed = planningList.get(i).getNbOfallowedVehicles();
while (j < vehiclesList.size() && vehiclesList.get(j).getTime() < nextTime.getTime()) {
count = Math.max(vehiclesList.get(j).nbOfVehicleArriving() - nbOfVehiclesAllowed + count, 0);
queues1.add(new Queue(vehiclesList.get(j).getDate(), count));
j++;
}
}

Class Queue有数据和 noOfVehiclesInQueue 作为成员变量。

class Vehicle {
private Date date;
private int nbOfVehicleArriving;
public Vehicle(Date date, int nbOfVehicleArriving) {
this.date = date;
this.nbOfVehicleArriving = nbOfVehicleArriving;
}
public int getNbOfVehicleArriving() {
return nbOfVehicleArriving;
}
public Date getDate() {
return date;
}       
}

class Planning {
private Date date;
private int nbOfallowedVehicles;
public Planning(Date date, int nbOfallowedVehicles) {
this.date = date;
this.nbOfallowedVehicles = nbOfallowedVehicles;
}
public int getNbOfallowedVehicles() {
return nbOfallowedVehicles;
}
}

class Queue {
private Date date;
private int noOfVehiclesInQueue;
public Queue(Date date, int noOfVehiclesInQueue) {
this.date = date;
this.noOfVehiclesInQueue = noOfVehiclesInQueue;
}
public int getNoOfVehiclesInQueue() {
return noOfVehiclesInQueue;
}
@Override
public String toString() {
return "Queue [date=" + date + ", noOfVehiclesInQueue=" + noOfVehiclesInQueue + "]";
}           
}

public class Demo {         
public static void main(String[] args) {
List<Vehicle> veh=new ArrayList<>();
List<Planning> plan=new ArrayList<>();
List<Queue> queue=new ArrayList<>();
veh.add(new Vehicle(new Date("01/01/2018 00:00:00"), 12));
veh.add(new Vehicle(new Date("01/01/2018 00:10:00"), 10));
veh.add(new Vehicle(new Date("01/01/2018 01:00:00"), 5));
veh.add(new Vehicle(new Date("01/01/2018 01:10:00"), 10));
plan.add(new Planning(new Date("01/01/2018 00:00:00"), 2));
plan.add(new Planning(new Date("01/01/2018 00:10:00"), 4));
plan.add(new Planning(new Date("01/01/2018 01:00:00"), 6));
for(int i=0;i<veh.size();i++) {
int vehicleinpreviousqueue=(i!=0)?queue.get(i-1).getNoOfVehiclesInQueue():0;
int vehiclearrving=veh.get(i).getNbOfVehicleArriving();
int vehicleallowed=(i<veh.size()-1)?plan.get(i).getNbOfallowedVehicles():plan.get(i-1).getNbOfallowedVehicles();
int vehicleinqueue=((vehicleinpreviousqueue+vehiclearrving-vehicleallowed)>0)?(vehicleinpreviousqueue+vehiclearrving-vehicleallowed):0;     

queue.add(new Queue(veh.get(i).getDate(), vehicleinqueue));
}
for(Queue q:queue) System.out.println(q.toString());
}
}

输出:

Queue [date=Mon Jan 01 00:00:00 IST 2018, noOfVehiclesInQueue=10]
Queue [date=Mon Jan 01 00:10:00 IST 2018, noOfVehiclesInQueue=16]
Queue [date=Mon Jan 01 01:00:00 IST 2018, noOfVehiclesInQueue=15]
Queue [date=Mon Jan 01 01:10:00 IST 2018, noOfVehiclesInQueue=19]

您可以将数据结构转换为如下所示的内容,然后应用下面的代码。

Map<Integer, Integer> arriving = new TreeMap<>();
arriving.put(1,12);
arriving.put(2,10);
arriving.put(3,5);
arriving.put(4,10);
Map<Integer, Integer> planning = new TreeMap<>();
planning.put(1,2);
planning.put(2,4);
planning.put(3,6);
AtomicInteger sum = new AtomicInteger(0);
int lastPlanning = 0;
Map<Integer, Integer> queue = new TreeMap<>();
for (Integer key : arriving.keySet())
{
lastPlanning = planning.getOrDefault(key, lastPlanning);
int diff = arriving.get(key) - lastPlanning;
queue.put(key, sum.addAndGet(diff));
}
System.out.println("queue = " + queue);

出于说明目的,使用整数键而不是日期。

最新更新