Getting the response from API as below
JavaScript
x
{
"name": "Restaurant name",
"operatingHours": "Mon-Thu, Sun 11:30 am - 10:00 pm / Fri-Sat 11:30 am - 10:30 pm"
},
{
"name": "Restaurant name",
"operatingHours": "Mon-Sat 11:00 am - 11:00 pm / Sun 11:00 am - 10:30 pm"
}
The output list should be like below
JavaScript
Mon 11:30 am - 10:00 pm,
Tue 11:30 am - 10:00 pm,
Wed 11:30 am - 10:00 pm,
Thu 11:30 am - 10:00 pm,
Fri 11:30 am - 10:30 pm,
Sat 11:30 am - 10:30 pm,
Sun 11:30 am - 10:00 pm
Advertisement
Answer
Assuming operatingHours
is always going to be in one of the formats given below:
Mon-Thu, Sun 11:30 am - 10:00 pm / Fri-Sat 11:30 am - 10:30 pm
Mon-Sat 11:00 am - 11:00 pm / Sun 11:00 am - 10:30 pm
given below can be an alternative solution:
JavaScript
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// Test
String operatingHours = "Mon-Thu, Sun 11:30 am - 10:00 pm \/ Fri-Sat 11:30 am - 10:30 pm";
System.out.println(getOpenDaysWithTime(operatingHours));
System.out.println();
operatingHours = "Mon-Sat 11:00 am - 11:00 pm \/ Sun 11:00 am - 10:30 pm";
System.out.println(getOpenDaysWithTime(operatingHours));
}
static String getOpenDaysWithTime(String operatingHours) {
String[] daysArr = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
List<String> daysList = Arrays.asList(daysArr);
try {
// Split the parameter string
String[] arr = operatingHours.split("\\/");
// Regex to find the time range e.g. 11:30 am - 10:00 pm
String durationRegex = "\d+:\d+ (?i)(?:[ap]m) - \d+:\d+ (?i)(?:[ap]m)";
Pattern pattern = Pattern.compile(durationRegex);
for (String e : arr) {
Matcher matcher = pattern.matcher(e);
if (matcher.find()) {
String durationStr = matcher.group();
if (durationStr != null) {
// String before the time range e.g. Mon-Thu, Sun -OR- Fri-Sat -OR- Sun
String daysStr = e.substring(0, e.indexOf(durationStr)).trim();
String[] parts = daysStr.trim().split(", ");
// Split the first element e.g. Mon-Thu -OR- Fri-Sat
String[] days = parts[0].split("-");
if (days.length > 1) {
for (int i = daysList.indexOf(days[0]); i <= daysList.indexOf(days[1]); i++) {
daysArr[i] = daysList.get(i) + " " + durationStr;
}
} else {
daysArr[daysList.indexOf(parts[0])] = parts[0] + " " + durationStr;
}
if (parts.length == 2) {
daysArr[daysList.indexOf(parts[1])] = parts[1] + " " + durationStr;
}
}
}
}
} catch (Exception e) {
System.out.println("Error occured while processing: " + operatingHours);
daysArr = new String[] {};
}
return String.join("," + System.lineSeparator(), daysArr);
}
}
Output:
JavaScript
Mon 11:30 am - 10:00 pm,
Tue 11:30 am - 10:00 pm,
Wed 11:30 am - 10:00 pm,
Thu 11:30 am - 10:00 pm,
Fri 11:30 am - 10:30 pm,
Sat 11:30 am - 10:30 pm,
Sun 11:30 am - 10:00 pm
Mon 11:00 am - 11:00 pm,
Tue 11:00 am - 11:00 pm,
Wed 11:00 am - 11:00 pm,
Thu 11:00 am - 11:00 pm,
Fri 11:00 am - 11:00 pm,
Sat 11:00 am - 11:00 pm,
Sun 11:00 am - 10:30 pm
Here is the demo of the regex used to find the time range.
Explanation of the regex:
d+
matches one or more digit(s):
matches the character:
literally(?i)
specifies case-insensitive matchNon-capturing group
(?:[ap]m)
[ap]
matches a single character out ofa
andp
m
matches the character m literally
-
matches the characters-
literally