-1
public int[] doInBackground()
{
    int[] finalNumber = new int[2];
    finalNumber[0] = 0;
    finalNumber[1] = 0;
    int count = 0;
    int[] forDisplay = new int[2];

    outerLoop:
    for(int i = 1; i <= findUpTo; i++)
    {
        forDisplay[0] = i;
        forDisplay[1] = 2;
        publish(forDisplay);

        for(int a = 1; a <= i; a++)
        {
            if(isCancelled())
                break outerLoop; 
            else
            {
                try
                {
                    Thread.sleep(numGen.nextInt(5));
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }

                forDisplay[0] = a;

                if(i%a == 0)
                {
                    forDisplay[1] = 1;

                    count++;

                    if(count > finalNumber[1])
                    {
                        finalNumber[0] = a;
                        finalNumber[1] = count;
                    }
                }
                else
                {
                    forDisplay[1] = 0;
                }

                publish(forDisplay);
            }
        }
        setProgress(100*(i+1)/findUpTo);

        count = 0;
    }

    return finalNumber;
}

protected void process(List<int[]> publishedValues)
{
    for(int i = 0; i < publishedValues.size(); i++)
    {/*
        if(publishedValues.get(i)[1] == 1)
        {
            numbers.setFont(new Font("Serif", Font.ITALIC, 16));
        }
        else if(publishedValues.get(i)[1] == 2)
        {
            numbers.setFont(new Font("Serif", Font.BOLD, 18));
            numbers.append("\t");
        }*/

        numbers.append(publishedValues.get(i)[0] + "\n");
        //numbers.setFont(new Font("Serif", Font.PLAIN, 16));
    }
}

これが機能しない理由はわかりません。誰かが助けることができれば、私はそれを感謝します. JTextArea で forDisplay[0] を一度公開しようとしています。forDisplay[1] は、処理中のフォントを決定するために使用されます (フォントの変更を今のところコメントしましたが、処理中の ifs に入っていても機能していませんでした [テキストのインデントが繰り返されていました])

問題は、プロセスが同じ番号を連続して複数回追加し、他の番号をスキップしているように見えることです。その理由はわかりません。

プログラム自体は、1 から "findUpTo" (ユーザー入力) までの剰余を生成しない除数が最も多い数を見つけることを任されています。

私は SwingWorker を初めて使用するので、この問題を理解するのに苦労しています。

4

1 に答える 1

0

あなたが言ったように、それが最も多くの約数を見つけることに関連している場合、あなたのコードを理解するのは難しいです. アルゴリズムの質問のように、あなたの問題にアプローチします。

  1. List オブジェクト publishedValues の内容を知る必要があります。その内容を質問に投稿するだけです。プロセス関数の for ループは、機能するのに十分単純です。ただし、それが何であれ、クリアせずに GUI オブジェクト番号に追加し続ける方法は好きではありません。

  2. 「if( count > finalNumber..)」へのいくつかの依存関係とその影響のため、finalNumber のコードは少しわかりにくいと思います。私の提案は、すべての除数を取得した後で比較を行うことです。デバッグを容易にします。

  3. 最後に、これはアルゴリズムの問​​題だと思うので、この GUI とスレッドをすべて使用せずにコードのプロトタイプを作成してください。学習のためだけにこれを行っていると思いますが、それは物事を複雑にします。ソフトウェア業界では、物事を可能な限り単純にして複雑さを軽減することを高く評価しています。私はそれをシンプルに保つようにあなたに挑戦します!

于 2012-05-18T19:28:14.640 に答える