2

私は次のことをしようとしていますが、クラッシュまたは無限ループなしでそれをどのように正確に行うかを理解することはできません:

異なるタスクをそれぞれ異なる回数、またはこの種の情報を使用して分散する必要があるキューを作成する必要があります。

  • タスクX:[NextOne、LastOne]

    • タスク1:[30,32]
    • タスク2:[76,81]
    • タスク3:[2,2]
    • タスク4:[5,8]

つまり、「タスク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になります。

例えば、

Task1 => array(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 に答える