Getting the response from API as below
{ "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
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:
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:
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