-
Notifications
You must be signed in to change notification settings - Fork 0
/
Booking.java
162 lines (129 loc) · 4.85 KB
/
Booking.java
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package basiclevelpractice;
import java.util.*;
public class Booking
{
public static void bookTaxi(int customerID,char pickupPoint,char dropPoint,int pickupTime,List<Taxi> freeTaxis)
{
// to find nearest
int min = 999;
//distance between pickup and drop
int distanceBetweenpickUpandDrop = 0;
//this trip earning
int earning = 0;
//when taxi will be free next
int nextfreeTime = 0;
//where taxi is after trip is over
char nextSpot = 'Z';
//booked taxi
Taxi bookedTaxi = null;
//all details of current trip as string
String tripDetail = "";
for(Taxi t : freeTaxis)
{
int distanceBetweenCustomerAndTaxi = Math.abs((t.currentSpot - '0') - (pickupPoint - '0')) * 15;
if(distanceBetweenCustomerAndTaxi < min)
{
bookedTaxi = t;
//distance between pickup and drop = (drop - pickup) * 15KM
distanceBetweenpickUpandDrop = Math.abs((dropPoint - '0') - (pickupPoint - '0')) * 15;
//trip earning = 100 + (distanceBetweenpickUpandDrop-5) * 10
earning = (distanceBetweenpickUpandDrop-5) * 10 + 100;
//drop time calculation
int dropTime = pickupTime + distanceBetweenpickUpandDrop/15;
//when taxi will be free next
nextfreeTime = dropTime;
//taxi will be at drop point after trip
nextSpot = dropPoint;
// creating trip detail
tripDetail = customerID + " " + customerID + " " + pickupPoint + " " + dropPoint + " " + pickupTime + " " +dropTime + " " + earning;
min = distanceBetweenCustomerAndTaxi;
}
}
//setting corresponding details to allotted taxi
bookedTaxi.setDetails(true,nextSpot,nextfreeTime,bookedTaxi.totalEarnings + earning,tripDetail);
//BOOKED SUCCESSFULLY
System.out.println("Taxi " + bookedTaxi.id + " booked");
}
public static List<Taxi> createTaxis(int n)
{
List<Taxi> taxis = new ArrayList<Taxi>();
// create taxis
for(int i=1 ;i <=n;i++)
{
Taxi t = new Taxi();
taxis.add(t);
}
return taxis;
}
public static List<Taxi> getFreeTaxis(List<Taxi> taxis,int pickupTime,char pickupPoint)
{
List<Taxi> freeTaxis = new ArrayList<Taxi>();
for(Taxi t : taxis)
{
//taxi should be free
//taxi should have enough time to reach customer before pickuptime
if(t.freeTime <= pickupTime && (Math.abs((t.currentSpot - '0') - (pickupPoint - '0')) <= pickupTime - t.freeTime))
freeTaxis.add(t);
}
return freeTaxis;
}
public static void main(String[] args)
{
//create 4 taxis
List<Taxi> taxis = createTaxis(4);
Scanner s = new Scanner(System.in);
int id = 1;
while(true)
{
System.out.println("0 - > Book Taxi");
System.out.println("1 - > Print Taxi details");
int choice = s.nextInt();
switch(choice)
{
case 0:
{
//get details from customers
int customerID = id;
System.out.println("Enter Pickup point");
char pickupPoint = s.next().charAt(0);
System.out.println("Enter Drop point");
char dropPoint = s.next().charAt(0);
System.out.println("Enter Pickup time");
int pickupTime = s.nextInt();
//check if pickup and drop points are valid
if(pickupPoint < 'A' || dropPoint > 'F' || pickupPoint > 'F' || dropPoint < 'A')
{
System.out.println("Valid pickup and drop are A, B, C, D, E, F. Exitting");
return;
}
// get all free taxis that can reach customer on or before pickup time
List<Taxi> freeTaxis = getFreeTaxis(taxis,pickupTime,pickupPoint);
//no free taxi means we cannot allot, exit!
if(freeTaxis.size() == 0)
{
System.out.println("No Taxi can be alloted. Exitting");
return;
}
//sort taxis based on earnings
Collections.sort(freeTaxis,(a,b)->a.totalEarnings - b.totalEarnings);
// 3,4,2 - > 2,3,4
//get free Taxi nearest to us
bookTaxi(id,pickupPoint,dropPoint,pickupTime,freeTaxis);
id++;
break;
}
case 1:
{
//two functions to print details
for(Taxi t : taxis)
t.printTaxiDetails();
for(Taxi t : taxis)
t.printDetails();
break;
}
default:
return;
}
}
}
}