Я пытаюсь разработать программу, которая принимает в качестве входных данных расписание записи видеорегистратора и определяет, какие шоу записываются и в какое время. Одновременно могут быть включены несколько шоу, которые установлены для записи, и DVR может записывать только одно шоу одновременно. Там может быть несколько передач одного и того же шоу. Если все трансляции одного шоу конфликтуют с другими шоу, то будут записаны шоу с наивысшим приоритетом. Другими словами, вам может потребоваться учитывать приоритет более двух шоу при разрешении конфликтов. Шоу должно быть записано только один раз.
Входной сигнал: -
Входные данные содержат список шоу для записи, а также день и время их трансляции. Показы перечислены в порядке приоритетов, причем первый показ имеет самый высокий приоритет. Каждая строка содержит название шоу, за которым следуют серии дней и времени. Каждый день и время состоят из трехбуквенной аббревиатуры для дня недели (т. Е. Одного из SUN, MON, TUE, WED, THU, FRI или SAT), за которым следует время дня, выраженное в «военном времени». ''. Все шоу начинаются в час и будут длиться менее часа. Показы для каждого шоу перечислены в произвольном порядке. Нет ограничений на количество передач, которые может иметь шоу. Разделителем входных данных является символ «/».
Пример: -
- Programme1 / СРД / 2000 / ВС / 2200
- Programme2 / WED / 2000
- Programme3 / ЧГ / 1900
- Programme4 / ЧГ / 2000
- Programme5 / ПН / 2000
- Programme6 / Вт / 2000
- Programme7 / Вт / 2000 / WED / 2000
- Programme8 / ВС / 2000
- Programme9 / ВС / 1900
- Programme10 / ВС / 2000 / Вт / 1900
OUTPUT
Список, отображающий название шоу (в том же порядке) и время его записи на этой неделе. Если шоу не может быть запланировано, вы должны вывести строку «Impossible».
- Programme1 SUN 2200
- Программа2 СРЕД 2000
- Программа3 ЧТ 1900
- Программа4 ЧТ 2000
- Программа 5 МОН 2000
- Programme6 TUE 2000
- Programme7 Невозможно
- Programme8 SUN 2000
- Программа9 СОЛНЦЕ 1900
- Programme 10 TUE 1900
Какую структуру данных я буду использовать для этого? Подобный Вопрос с ответом уже есть, но я не уверен, как я могу его использовать, поскольку может быть несколько передач одного и того же шоу, и определен порядок приоритетов программ.
Код для извлечения входных данных из файла (содержимое файла совпадает с текстом примера) и преобразования его в двумерный массив.
Формат: - {{Programme1, WED, 2000, SUN, 2200}, {Programme2, WED, 2000}, и т. Д.}}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[][] input = readInput();
input = schedules(input);
for (int i = 0; i < input.length; ++i) {
System.out.println(input[i][0]+" "+input[i][1]);
}
}
public static String[][] readInput() {
List<String> lines = null;
String path = "input.txt";
try {
lines = Files.readAllLines(Paths.get(path), StandardCharsets.UTF_8);
} catch (IOException ioEx) {
System.out.println(ioEx.getMessage());
}
int i = 0;
String[][] inputArray = new String[lines.size()][];
for (String temp: lines) {
StringTokenizer st1 = new StringTokenizer(temp, "/");
int j = st1.countTokens();
inputArray[i] = new String[j];
st1 = new StringTokenizer(temp, "/");
for(int k=0; k < j;++k) {
inputArray[i][k] = st1.nextToken();
}
++i;
}
return inputArray;
}
Отправка полного решения: -
public static String[][] schedules(String[][] airingSchedule) {
String prevValue;
Map<String,String> aLinkedHashmap = new LinkedHashMap<>();
for(int i = 0;i < airingSchedule.length;++i) {
for(int j =airingSchedule[i].length - 1; j > 1;j-=2) {
if(aLinkedHashmap.containsKey(airingSchedule[i][j-1]+airingSchedule[i][j])) {
prevValue = aLinkedHashmap.put(airingSchedule[i][j-1]+airingSchedule[i][j], airingSchedule[i][0]);
if(!aLinkedHashmap.containsValue(prevValue)) {
aLinkedHashmap.put(airingSchedule[i][j-1]+airingSchedule[i][j], prevValue);
}
} else {
aLinkedHashmap.put(airingSchedule[i][j-1]+airingSchedule[i][j], airingSchedule[i][0]);
}
}
}
Iterator<String> it = aLinkedHashmap.keySet().iterator();
Map<String,String> map = new LinkedHashMap<>();
// Removing multiple occurrence of shows
while(it.hasNext()) {
String key = it.next();
String val = aLinkedHashmap.get(key);
if(!map.containsKey(val))
map.put(val, key);
}
String[][] output = new String[airingSchedule.length][2];
for(int i =0; i < airingSchedule.length ;++i) {
if(map.containsKey(airingSchedule[i][0])) {
output[i][1] = map.get(airingSchedule[i][0]);
output[i][1] = output[i][1].substring(0,3)+" "+output[i][1].substring(3);
output[i][0] = airingSchedule[i][0];
} else {
output[i][1] = "Impossible";
output[i][0] = airingSchedule[i][0];
}
}
return output;
}