我正在尝试开发一个程序,将DVR的录制时间表作为输入,并确定录制哪些节目以及在什么时间录制。多个节目可以在为录制设置的同一时间打开,DVR一次只能录制一个节目。同一节目可以有多次播出。如果特定节目的所有播出都与另一个节目冲突,则将记录具有最高优先级的节目。换句话说,在解决冲突时,您可能必须考虑两个以上节目的优先级。节目只应录制一次。
输入: -
输入数据包含要录制的节目列表以及播出的日期和时间。节目按优先顺序列出,第一个节目具有最高优先级。每行包含节目名称,后跟一系列日期和时间。每天和每个时间由一个星期几的三个字母缩写(即SUN,MON,TUE,WED,THU,FRI或SAT中的一个)组成,其后是一天中的时间,以“军事时间”表示''。所有节目都从小时开始,持续时间不到一小时。每个节目的播出都没有特别的顺序列出。演出的播出次数没有限制。输入数据的分隔符是'/'字符。
实施例: -
输出
显示节目名称(相同顺序)的列表以及该周记录的时间。如果无法安排节目,则应输出字符串“不可能”。
我应该使用什么数据结构?一个类似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;
}
答案 0 :(得分:0)
您可以使用LinkedHashMap DS(保留订单),其中您可以将DAY + Time作为键,将程序名称作为值。则: -