2

我正在尝试执行以下操作,但无法弄清楚如何在不崩溃或无限循环的情况下做到这一点:

我必须创建一个队列,我必须在其中分配不同的任务不同的次数,或者使用这种信息:

  • 任务 X:[NextOne,LastOne]

    • 任务 1:[30,32]
    • 任务 2:[76,81]
    • 任务 3:[2,2]
    • 任务 4:[5,8]

这意味着“Task 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++;
}

但正如你想象的那样,这实际上什么也没做,只是改变了信息的形状。我真的被困在这里我不知道为什么,这实际上应该不难弄清楚。我会很感激任何帮助。

4

3 回答 3

1

我想您可以将$s其用作散列(或等效数组)的键,并且只要遇到具有相同键的元素就将值增加 1。在这种情况下,默认值为 0。

例如,

任务1 => 数组(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辅助功能来检查之前是否出现过某些任务。

于 2012-07-07T18:48:06.293 回答
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
于 2012-07-07T18:48:46.267 回答
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

希望这可以帮助。

于 2012-07-07T19:46:21.610 回答