-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1396. Design Underground System.java
More file actions
90 lines (87 loc) · 3.01 KB
/
Copy path1396. Design Underground System.java
File metadata and controls
90 lines (87 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class Passenger{
private Integer id;
private String startStation;
private Integer timeArrived;
Passenger(Integer id,String startStation,Integer timeArrived){
this.timeArrived = timeArrived;
this.id = id;
this.startStation = startStation;
}
public Integer getId() {
return id;
}
public String getStartStation() {
return startStation;
}
public Integer getTimeArrived() {
return timeArrived;
}
}
class Road{
private String from,to;
private Integer numOfTravels;
private double averageTime;
public Road(String from, String to) {
this.from = from;
this.to = to;
this.numOfTravels = 0;
this.averageTime = 0;
}
public String getFrom() {
return from;
}
public String getTo() {
return to;
}
public Integer getNumOfTravels() {
return numOfTravels;
}
public void addTravel(double averageTime) {
//x/n
//x+t/n+1
this.averageTime = ((this.averageTime*this.numOfTravels)+averageTime)/(numOfTravels+1);
this.numOfTravels++;
}
public double getAverageTime() {
return averageTime;
}
}
class Network{
private Map<String,Map<String,Road>> map;
public Network() {
this.map = new HashMap<String,Map<String,Road>>();
}
private void addRoad(String startStation, String endStation){
if(!map.containsKey(startStation)) map.put(startStation,new HashMap<>());
if(!map.containsKey(endStation)) map.put(endStation,new HashMap<>());
if(!map.get(startStation).containsKey(endStation)) map.get(startStation).put(endStation,new Road(startStation,endStation));
if(!map.get(endStation).containsKey(startStation)) map.get(endStation).put(startStation,new Road(startStation,endStation));
}
public Road getRoad(String startStation, String endStation){
addRoad(startStation, endStation);
return map.get(startStation).get(endStation);
}
}
class UndergroundSystem {
private Map<Integer,Passenger> currentPassengers;
private Network network;
public UndergroundSystem() {
currentPassengers = new HashMap<Integer,Passenger>();
network = new Network();
}
public void checkIn(int id, String stationName, int t) {
if(currentPassengers.containsKey(id)) return;
currentPassengers.put(id, new Passenger(id, stationName, t));
}
public void checkOut(int id, String stationName, int t) {
Passenger outPassenger = currentPassengers.get(id);
currentPassengers.remove(id);
Road road1 = network.getRoad(outPassenger.getStartStation(),stationName);
Road road2 = network.getRoad(stationName,outPassenger.getStartStation());
road1.addTravel(t-outPassenger.getTimeArrived());
road2.addTravel(t-outPassenger.getTimeArrived());
}
public double getAverageTime(String startStation, String endStation) {
return network.getRoad(startStation, endStation).getAverageTime();
}
}