我无法为以下问题创建高性能功能。我正在建立一个时间表,我需要在列中分隔一系列项目,这样就没有列有2个项目在开始/结束时间范围内共享一小时。
我当前的解决方案有效,但是在最糟糕的情况下进行了大量浪费计算,其中所有项目具有相同的小时范围,并且每个项目创建一个新列。
function getItemsPerColumn(items) {
let itemsPerHour = {},
itemsPerColumn = {},
itemsCount = items.length,
currentHour = 8,
columnIndex = 1;
items.forEach(item => {
let start = moment(item.startHour),
end = moment(item.endHour),
startHour = start.format('H'),
endHour = end.format('H');
if (itemsPerHour[startHour] === undefined) { itemsPerHour[startHour] = []; }
itemsPerHour[startHour].push({
rowStart: startHour,
rowEnd: endHour,
item: item
});
});
while (itemsCount > 0) {
if (itemsPerHour[currentHour] !== [] && itemsPerHour[currentHour] !== undefined) {
if (itemsPerColumn[columnIndex] === undefined) { itemsPerColumn[columnIndex] = []; }
let nextHour = itemsPerHour[currentHour][0].rowEnd;
itemsPerColumn[columnIndex].push(itemsPerHour[currentHour].shift());
currentHour = nextHour - 1;
itemsCount--;
}
if (currentHour === 18) {
currentHour = 8;
columnIndex++;
}
else currentHour++;
}
return itemsPerColumn;
}
答案 0 :(得分:1)
您的问题与Interval scheduling类似。您可以找到最适合的解决方案,如this(C ++语言)。
答案 1 :(得分:0)
为所有间隔结束制作三元组{Time, StartOrEnd, ItemId}
的数组/列表
对于间隔的开始,StartOrEnd
+1
为-1
,对于间隔结束,Time
为Time
按-1
键对其进行排序。如果发生+1
的平局(等时),请在Counter=0
之前使用辅助密钥:StartOrEnd
制作Counter
遍历数组,将当前记录值的ItemId
添加到Counter-th
将当前记录的// [...]
PrintStream getPrintStream() {
if (printStream == null) {
OutputStream output = new OutputStream() {
ByteArrayOutputStream baos = new ByteArrayOutputStream()
@Override
public void write(int b) throws IOException {
baos.write(b)
}
@Override
public void flush() {
logger.debug(this.baos.toString())
baos = new ByteArrayOutputStream()
}
}
printStream = new PrintStream(output, true) // true: autoflush must be set!
}
return printStream
}
// [...]
分配到1.jpeg
列