我正在尝试执行以下操作,并且无法确定在没有崩溃或无限循环的情况下它是如何完成的:
我必须创建一个队列,我必须在其中分配不同的任务次数,或者使用这种信息:
任务X:[NextOne,LastOne]
意味着“任务X”将成为“LastOne - NextOne”次,如果两者相等,则不会入队,并且它们按X顺序进入队列。 在此示例中,队列应如下所示:
FIRST
Task1[30]
Task2[76]
Task4[5]
Task1[31]
Task2[77]
Task4[6]
Task1[32]
Task2[78]
Task4[7]
Task2[79]
Task4[8]
Task2[80]
Task2[81]
LAST
这不是语言问题,更多的是我在这里的算法问题。使用PHP我做了以下内容:
$tasks = array(
'Task1' => array(30,32),
'Task2' => array(76,81),
'Task3' => array(2,2),
'Task4' => array(5,8)
);
$aux = array();
$i=0;
foreach($tasks as $s=>$n) {
$aux[$i]['task'] = $s;
$aux[$i]['times'] = $n[1]-$n[0];
$aux[$i]['first'] = $n[0];
$i++;
}
但是你想象这实际上什么都不做,只需改变信息的形状。我真的被困在这里我不知道为什么,这实际上应该不难理解。我很感激任何帮助。
答案 0 :(得分:1)
我猜你可以使用$s
作为哈希(或等效数组)的键,只要在遇到具有相同键的元素时将值增加1。在这种情况下,默认值为0。
例如,
Task1 =>阵列(30,32)
将按照
的顺序排列Task1[30] (default value to 0)
...
...
Task1[31] (add 1 which becomes 1)
...
Task1[32] (add 1 which becomes 2)
这意味着Task1总共出现了3次,最终的times
值应为2。
我认为您可以使用array_key_exists
辅助函数来检查先前是否出现了某个任务。
答案 1 :(得分:1)
在python中(我可能会误解你的“这不是语言问题”评论 - 原谅我):
tasks = [
("Task1", 30, 32),
("Task2", 76, 81),
("Task3", 2, 2),
("Task4", 5, 8) ]
while not tasks == []:
# Pop first task off the current list
(n, s, e) = tasks[0]
tasks = tasks[1:]
print n, s
if s != e:
tasks.append( (n, s+1, e) )
对不起它不是在php中 - 这不是我的强项,但也许这会有所帮助?输出:
Task1 30
Task2 76
Task3 2
Task4 5
Task1 31
Task2 77
Task4 6
Task1 32
Task2 78
Task4 7
Task2 79
Task4 8
Task2 80
Task2 81
答案 2 :(得分:1)
在C#
结果如您所愿。
我添加了一个数字作为标志:1 =不排队,2 =任务的最后记录。
效率不高但有效!
private static void Main()
{
var tasks = new Dictionary<string, int[]>
{
{"Task1", new[] {30, 32, 0}},
{"Task2", new[] {76, 81, 0}},
{"Task3", new[] {2, 2, 0}},
{"Task4", new[] {5, 8, 0}}
};
int loopCounter = 0;
Console.WriteLine("FIRST");
while (loopCounter < tasks.Count)
{
foreach (var task in tasks)
{
if (task.Value[0] == task.Value[1])
{
if (task.Value[2] == 2)
{
loopCounter++;
Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
task.Value[2] = 1;
}
else if (task.Value[2] == 0)
{
loopCounter++;
task.Value[2] = 1;
}
}
else
{
Console.WriteLine(task.Key + "[" + task.Value[0] + "]");
task.Value[0]++;
if (task.Value[0] == task.Value[1])
task.Value[2] = 2;
}
}
}
Console.WriteLine("LAST");
Console.ReadLine();
}
输出:
FIRST
Task1[30]
Task2[76]
Task4[5]
Task1[31]
Task2[77]
Task4[6]
Task1[32]
Task2[78]
Task4[7]
Task2[79]
Task4[8]
Task2[80]
Task2[81]
LAST
希望这有帮助。