Java - DVR的冲突解决方案

时间:2018-05-02 20:11:53

标签: java algorithm data-structures collections

我正在尝试开发一个程序,将DVR的录制时间表作为输入,并确定录制哪些节目以及在什么时间录制。多个节目可以在为录制设置的同一时间打开,DVR一次只能录制一个节目。同一节目可以有多次播出。如果特定节目的所有播出都与另一个节目冲突,则将记录具有最高优先级的节目。换句话说,在解决冲突时,您可能必须考虑两个以上节目的优先级。节目只应录制一次。

输入: -

输入数据包含要录制的节目列表以及播出的日期和时间。节目按优先顺序列出,第一个节目具有最高优先级。每行包含节目名称,后跟一系列日期和时间。每天和每个时间由一个星期几的三个字母缩写(即SUN,MON,TUE,WED,THU,FRI或SAT中的一个)组成,其后是一天中的时间,以“军事时间”表示''。所有节目都从小时开始,持续时间不到一小时。每个节目的播出都没有特别的顺序列出。演出的播出次数没有限制。输入数据的分隔符是'/'字符。

实施例: -

  • Programme1 / WED / 2000 / SUN / 2200
  • Programme2 / WED / 2000
  • Programme3 / THU / 1900
  • Programme4 / THU / 2000
  • Programme5 / MON / 2000
  • Programme6 / TUE / 2000
  • Programme7 / TUE / 2000 / WED / 2000
  • Programme8 / SUN / 2000
  • Programme9 / SUN / 1900
  • Programme10 / SUN / 2000 / TUE / 1900

输出

显示节目名称(相同顺序)的列表以及该周记录的时间。如果无法安排节目,则应输出字符串“不可能”。

  • Programme1 SUN 2200
  • Programme2 WED 2000
  • Programme3 THU 1900
  • Programme4 THU 2000
  • Programme5 MON 2000
  • Programme6 TUE 2000
  • Programme7 Impossible
  • Programme8 SUN 2000
  • Programme9 SUN 1900
  • Programme10 TUE 1900

我应该使用什么数据结构?一个类似Question的答案已经存在,但我不知道如何使用它,因为可以多次播放同一节目并定义节目的优先顺序。

从文件中获取输入的代码。(文件内容与示例文本相同)并将其转换为二维数组。

格式: - {{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 :(得分:0)

您可以使用LinkedHashMap DS(保留订单),其中您可以将DAY + Time作为键,将程序名称作为值。则: -

  1. 在将密钥插入DS之前检查密钥是否存在。
  2. 如果Key存在,则输入新值并存储与key关联的先前值。
  3. 检查DS中是否仍然存在(步骤2的)先前值。
  4. 如果(步骤2的)值不存在,请使用此键恢复之前的值。
  5. 如果Key(步骤1)不存在,请将项目添加到DS。在这里,我们可能有相同值(程序)的多个条目。
  6. 删除相同值(程序)的多个条目。
  7. 以所需格式写出输出。