Meesho | SDE2 | Machine coding

Anonymous User
610

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)

Comments (3)