I was asked to write code to get the cheapest hotel to stay based on the input. There are three hotels with different weekend and weekday rates and rating. So when the input string is passed with the customer type and the dates, I had to return the cheapest hotel based on the rates and if there is a tie return hotel with highest rating.
A hotel chain wishes to offer room reservation services over the internet. They have three hotels : Lakewood, Bridgewood and Ridgewood. Each hotel has separate weekday and weekend (Saturday and Sunday) rates. There are special rates for rewards customer as a part of loyalty program. Each hotel has a rating assigned to it.
Lakewood with a rating of 3 has weekday rates as 110$ for regular customer and 80$ for rewards customer. The weekend rates are 90$ for regular customer and 80$ for a rewards customer.
Bridgewood with a rating of 4 has weekday rates as 160$ for regular customer and 110$ for rewards customer. The weekend rates are 60$ for regular customer and 50$ for a rewards customer.
Ridgewood with a rating of 5 has weekday rates as 220$ for regular customer and 100$ for rewards customer. The weekend rates are 150$ for regular customer and 40$ for a rewards customer.
Write a program to help an online customer find the cheapest hotel.
import java.util.*;
public class HotelRoomReservation {
private HashMap<String, List<Integer>> lakeWood = new HashMap<>();
private HashMap<String, List<Integer>> bridgeWood = new HashMap<>();
private HashMap<String, List<Integer>> ridgeWood = new HashMap<>();
private static int lakeWoodRating;
private static int bridgeWoodRating;
private static int rigdeWoodRating;
public HotelRoomReservation() {
setLakeWood();
setBridgeWood();
setRidgeWood();
}
private void setLakeWood() {
List<Integer> lakeWoodRewards = new ArrayList<>();
lakeWoodRewards.add(80);
lakeWoodRewards.add(80);
List<Integer> lakeWoodRegular = new ArrayList<>();
lakeWoodRegular.add(110);
lakeWoodRegular.add(90);
lakeWood.put("Rewards", lakeWoodRewards);
lakeWood.put("Regular", lakeWoodRegular);
lakeWoodRating = 3;
}
private void setBridgeWood() {
List<Integer> bridgeWoodRewards = new ArrayList<>();
bridgeWoodRewards.add(110);
bridgeWoodRewards.add(50);
List<Integer> bridgeWoodRegular = new ArrayList<>();
bridgeWoodRegular.add(160);
bridgeWoodRegular.add(60);
bridgeWood.put("Rewards", bridgeWoodRewards);
bridgeWood.put("Regular", bridgeWoodRegular);
bridgeWoodRating = 4;
}
private void setRidgeWood() {
List<Integer> ridgeWoodRewards = new ArrayList<>();
ridgeWoodRewards.add(100);
ridgeWoodRewards.add(40);
List<Integer> ridgeWoodRegular = new ArrayList<>();
ridgeWoodRegular.add(220);
ridgeWoodRegular.add(150);
ridgeWood.put("Rewards", ridgeWoodRewards);
ridgeWood.put("Regular", ridgeWoodRegular);
rigdeWoodRating = 5;
}
public String minCostHotel(String input) {
// Regular: 16Mar2009(mon), 17Mar2009(tue), 18Mar2009(wed)
String[] arr = input.split(",");
String customerType = "";
if (arr.length > 0) {
String tempArr[] = arr[0].split(":");
customerType = tempArr[0];
arr[0] = tempArr[1];
}
String hotel = minCostHotel(customerType, arr);
return hotel;
}
private String minCostHotel(String customerType, String[] arr) {
int numOfWeekdays = 0;
int numOfWeekends = 0;
int lakeWoodCost = 0;
int bridgeWoodCost = 0;
int ridgeWoodCost = 0;
for (int i = 0; i < arr.length; i++) {
String day = arr[i];
System.out.println(day);
if (day.contains("mon") || day.contains("tue") || day.contains("wed") || day.contains("thu")
|| day.contains("fri")) {
numOfWeekdays++;
} else {
numOfWeekends++;
}
}
List<Integer> valuesForLakewood = lakeWood.get(customerType); // 0 - weekday, 1- weekend
List<Integer> valuesForBridgeWood = bridgeWood.get(customerType);
List<Integer> valuesForRidgeWood = ridgeWood.get(customerType);
lakeWoodCost = numOfWeekdays * valuesForLakewood.get(0) + numOfWeekends * valuesForLakewood.get(1);
bridgeWoodCost = numOfWeekdays * valuesForBridgeWood.get(0) + numOfWeekends * valuesForBridgeWood.get(1);
ridgeWoodCost = numOfWeekdays * valuesForRidgeWood.get(0) + numOfWeekends * valuesForRidgeWood.get(1);
String hotel = minCost(lakeWoodCost, bridgeWoodCost, ridgeWoodCost);
System.out.println(lakeWoodCost + " " + bridgeWoodCost + " " + ridgeWoodCost);
return hotel;
}
private String minCost(int lakeWoodCost, int bridgeWoodCost, int ridgeWoodCost) {
int minCost = Math.min(lakeWoodCost, Math.min(bridgeWoodCost, ridgeWoodCost));
if (minCost == lakeWoodCost && minCost == bridgeWoodCost) {
return bridgeWoodRating > lakeWoodRating ? "BridgeWood" : "LakeWood";
} else if (minCost == bridgeWoodCost && minCost == ridgeWoodCost) {
return bridgeWoodRating > ridgeWoodCost ? "BridgeWood" : "RidgeWood";
} else if (minCost == lakeWoodCost && minCost == ridgeWoodCost) {
return lakeWoodCost > ridgeWoodCost ? "LakeWood" : "RidgeWood";
} else {
if (minCost == lakeWoodCost) {
return "LakeWood";
} else if (minCost == bridgeWoodCost) {
return "BridgeWood";
} else {
return "RidgeWood";
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//String input = "Regular: 16Mar2009(mon), 17Mar2009(tue), 18Mar2009(wed)"; //-> LakeWood
String input = "Rewards: 26Mar2009(thu), 27Mar2009(fri), 28Mar2009(sat)"; // -> RidgeWood
HotelRoomReservation hotelRoom = new HotelRoomReservation();
String hotel = hotelRoom.minCostHotel(input);
System.out.println(hotel);
}
}
Unfortunately, I was rejected even after successfully executing and running the code and after getting the expected results. Can anyone please review this code and tell me what mistakes I have done that could have potentially led to my rejection?
Hotel
class, and 3 instances of it: you don't want to constraint your code to just these 3 hotels, so you extract and parameterize as much as you can. ..it's just a thought process really. \$\endgroup\$