2

これは、中級 Java クラスの課題の質問です。組み込みの add メソッドを使用せずに、リンクされたリストを使用して「辞書」を作成することになっています。ノードをアルファベット順に追加するのに苦労しています。各ノードをリストに追加または追加するだけで問題はありませんが、それは質問が求めているものではありません。このプログラムは、アルファベットの昇順と降順の両方で単語 (およびその意味) のリストを表示できるはずです (2 つの別個の JOptionPane メニュー オプション)。その証明は...難しいです。これが私の追加方法です:

void add(WordMeaning wm)
{
    WordMeaningNode word = new WordMeaningNode(wm);
    WordMeaningNode current, prev;

    try
    {
        if(wmn == null)
        {
            wmn = word;
        }
        else
        {
            current = wmn;
            prev = null;
            while(current.next != null)
            {
                prev = current;
                current = current.next;
            }
            if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) < 0)
            {
                word.next = current.next;
                current.next = word;
            }
            else if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) > 0)
            {
                prev = current;
                current.next = word;
            }
        }
    }
    catch(NullPointerException e)
    {
        e.printStackTrace();
    }
}

while ループの下の if ステートメントに問題があることは確かです。私はちょうど何を知らない。何が悪いのか、まだよくわかりません(笑)。最初に通常どおり追加するだけでよいのではないかと思っています。次に、それを取得してアルファベット順に並べ替えます。もしそうなら、どうすればいいですか?優しくしてください。;)

4

2 に答える 2

0

最初にすべての単語を昇順で追加してから、必要な順序 (昇順/降順) でそれらを反復処理できると思います。すでに前のノードと次のノードの二重リンク リストがあるため、反復は問題になりません。試す :

while(current.next != null)
        {
            prev = current;
            current = current.next;

            if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) > 0)
            {
                word.next = current.next;
                current.next = word;
                break;  // break when correct position of word is found in ascending order.
            }
          /*  else if(word.wm.getWord().compareToIgnoreCase(current.wm.getWord()) > 0)
            {
                prev = current;
                current.next = word;
            }
          */  // No else condition is required
        }
}
于 2012-11-17T09:17:05.013 に答える
0

while ループは、リンクされたリストの最後までスキップします。この最後に、ノードを挿入または追加する場所を決定しようとします(言及した場合)。

やりたいことは、挿入ポイントにスキップすることです (挿入するノードよりも大きなノードが後に続くノードを見つけます)。

次のようなものが必要です(これは割り当てであるため、疑似コード):

boolean found = false;
while (!found && current.next != null) {
    if (next word > word) {
        found = true;
    } else {
         prev = current;
         current = current.next;
    }
}
if (!found) {
    append to end of list
} else {
    insert before next
}
于 2012-11-17T09:20:55.063 に答える