Design a ride sharing application :
Driver can publish a ride
Rider can search a ride based on stratergies such as shortest, fastest
Rider can select a ride
Bonus
show all rides taken and published by a user
Calculate fuel saved
class User{
private Long userId;
private String name;
private Vehicle vehicle;
List<Ride>ridesOffered;
List<Ride>ridesTaken;
public User(Long userId) {
this.userId = userId;
this.ridesOffered = new ArrayList<>();
this.ridesTaken = new ArrayList<>();
}
public User(Long userId, Vehicle vehicle) {
this.userId = userId;
this.vehicle = vehicle;
this.ridesOffered = new ArrayList<>();
this.ridesTaken = new ArrayList<>();
}
public User(Long userId, String name, Vehicle vehicle) {
this.userId = userId;
this.name = name;
this.vehicle = vehicle;
this.ridesOffered = new ArrayList<>();
this.ridesTaken = new ArrayList<>();
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public List<Ride> getRidesOffered() {
return ridesOffered;
}
public void addRidesOffered(Ride ride){
this.ridesOffered.add(ride);
}
public List<Ride> getRidesTaken() {
return ridesTaken;
}
public void addRidesTaken(Ride ride) {
this.ridesTaken.add(ride);
}}
class Vehicle{
private String regNo;
public Vehicle(String regNo) {
this.regNo = regNo;
}}
class Ride{
private Long rideId;
private User driver;
private User rider;
private String from;
private String destination;
private Date startTime;
private Date endTime;
private Double distance;
private Integer seats;
public Ride(Long rideId, User driver, String from, String destination, Date startTime, Date endTime, Integer seats) {
this.rideId = rideId;
this.driver = driver;
this.from = from;
this.destination = destination;
this.startTime = startTime;
this.endTime = endTime;
this.seats = seats;
}
public Long getRideId() {
return rideId;
}
public void setRideId(Long rideId) {
this.rideId = rideId;
}
public User getDriver() {
return driver;
}
public void setDriver(User driver) {
this.driver = driver;
}
public User getRider() {
return rider;
}
public void setRider(User rider) {
this.rider = rider;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Double getDistance() {
return distance;
}
public void setDistance(Double distance) {
this.distance = distance;
}
public Integer getSeats() {
return seats;
}
public void setSeats(Integer seats) {
this.seats = seats;
}
@Override
public String toString() {
return "Ride{" +
"rideId=" + rideId +
", driver=" + driver +
", rider=" + rider +
", from='" + from + '\'' +
", destination='" + destination + '\'' +
", startTime=" + startTime +
", endTime=" + endTime +
", distance=" + distance +
", seats=" + seats +
'}';
}}
class RideShareDto{
private String from;
private String to;
private Date startTime;
private Date endTime;
private Long userId;
private Vehicle vehicle;
private Integer availableSeats;
public RideShareDto(String from, String to, Date startTime, Date endTime, Long userId, Vehicle vehicle, Integer availableSeats) {
this.from = from;
this.to = to;
this.startTime = startTime;
this.endTime = endTime;
this.userId = userId;
this.vehicle = vehicle;
this.availableSeats = availableSeats;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public Integer getAvailableSeats() {
return availableSeats;
}
public void setAvailableSeats(Integer availableSeats) {
this.availableSeats = availableSeats;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}}
enum SelectionStratergyType{
FASTEST,EARLIEST
}
interface SelectionStratergy{
List find(Listrides,Long userId,String from,String to);
}
class EarliestSelectionStratergy implements SelectionStratergy{
@Override
public Listfind(Listrides,Long userId,String from,String to){
rides.sort((a,b)->a.getStartTime().compareTo(b.getStartTime()));
rides = rides.stream().filter((a)-> {
if(a.getFrom().equals(from) && a.getDestination().equals(to) && !Objects.equals(a.getDriver().getUserId(), userId))
return true;
return false;
}).collect(Collectors.toList());
return rides;
}
}
class RideManager{
private static RideManager rideManager = null;
private Long rideCount = 0l;
private Long userCount = 0l;
Map<Long,Ride>availableRideMap;
Map<Long,Ride>completedRideMap;
Map<Long,User>userMap;
private RideManager(){
this.availableRideMap = new HashMap<>();
this.completedRideMap = new HashMap<>();
this.userMap = new HashMap<>();
}
public static RideManager getInstance(){
if (rideManager == null){
rideManager = new RideManager();
return rideManager;
}
return rideManager;
}
public void addDriver(String userName,Vehicle vehicle){
User user = new User(userCount++,userName,vehicle);
userMap.put(user.getUserId(),user);
}
public void addRider(String userName){
User user = new User(userCount++);
user.setName(userName);
userMap.put(user.getUserId(),user);
}
public Ride shareRide(RideShareDto rideShareDto){
User driver = null;
if (!userMap.containsKey(rideShareDto.getUserId())){
User user = new User(rideShareDto.getUserId(),rideShareDto.getVehicle());
userMap.put(user.getUserId(),user);
}
driver = userMap.get(rideShareDto.getUserId());
Ride ride = new Ride(rideCount++,driver,rideShareDto.getFrom(),rideShareDto.getTo(),rideShareDto.getStartTime(),rideShareDto.getEndTime(),rideShareDto.getAvailableSeats());
driver.addRidesOffered(ride);
availableRideMap.put(ride.getRideId(),ride);
return ride;
}
public List<Ride>getRides(Long userId,String source,String destination,SelectionStratergyType stratergy){
SelectionStratergy selectionStratergy = new EarliestSelectionStratergy();
List<Ride>available = new ArrayList<>(availableRideMap.values());
return selectionStratergy.find(available,userId,source,destination);
}
public Ride bookRide(Long userId,Long rideId){
User rider = null;
if (!userMap.containsKey(userId)){
User user = new User(userId);
userMap.put(user.getUserId(),user);
}
rider = userMap.get(userId);
if (!availableRideMap.containsKey(rideId)){
System.out.println("Ride not available");
}
Ride ride = availableRideMap.get(rideId);
ride.setRider(rider);
availableRideMap.remove(rideId);
completedRideMap.put(rideId,ride);
rider.addRidesTaken(ride);
return ride;
}
public List<Ride>getActiveRides(){
List<Ride>rides = new ArrayList<>(availableRideMap.values());
return rides;
}
public List<Ride>getRidesTakenByUser(Long userId){
User user = null;
if (!userMap.containsKey(userId)){
throw new RuntimeException("User Not found");
}
user = userMap.get(userId);
return user.getRidesTaken();
}
public List<Ride>getRidesOfferedByUser(Long userId){
User user = null;
if (!userMap.containsKey(userId)){
throw new RuntimeException("User Not found");
}
user = userMap.get(userId);
return user.getRidesOffered();
}}
public class RideSharing {
public void run(){
RideManager rideManager = RideManager.getInstance();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
rideManager.addDriver("gorav",new Vehicle("HR"));
rideManager.addDriver("sorav",new Vehicle("HR-02"));
rideManager.addRider("happy");
rideManager.shareRide(new RideShareDto("Banglore","Mysore",new Date(),new Date(),0l,new Vehicle("hr-02"),1));
Listrides = rideManager.getRides(1L,"Banglore","Mysore",SelectionStratergyType.EARLIEST);
Lista = rideManager.getActiveRides();
rideManager.bookRide(1L,0L);
ListrideOffered = rideManager.getRidesOfferedByUser(0L);
ListrideTaken = rideManager.getRidesTakenByUser(1L);
System.out.println();
}Made ride manager as singleton to handle concurrency
also explained stratergies can be fetched using factory pattern because of lack of time not able to implement
Vedict : Rejected (let me know what we can improved in this)


