Java - Разрешение конфликтов для DVR - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь разработать программу, которая принимает в качестве входных данных расписание записи видеорегистратора и определяет, какие шоу записываются и в какое время. Одновременно могут быть включены несколько шоу, которые установлены для записи, и 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;
}

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать LinkedHashMap DS (для сохранения порядка), в котором вы можете указать DAY + Time в качестве ключа и имя программы в качестве значения. Тогда: -

  1. Проверьте, существует ли ключ, прежде чем вставлять его в DS.
  2. Если ключ существует, введите новое значение и сохраните предыдущее значение, связанное с ключом.
  3. Проверьте, существует ли предыдущее значение (шага 2) в DS.
  4. Если значение (из шага 2) не существует, восстановите предыдущее значение с помощью этого ключа.
  5. Если Ключ (шага 1) не существует, добавьте элемент в DS. Здесь у нас может быть несколько записей для одного и того же значения (программы).
  6. Удалить несколько записей одного значения (программы).
  7. Запись вывода в желаемом формате.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...