-6

私はクラスを持っています:

public class WordNode {

    private String _word;
    private WordNode _next;
....
}

および次のリスト:

public class TextList {
    private WordNode _head;

    public char mostFrequentStartingLetter(....){}
}

TextList クラスでは、リスト内の単語が始まる最も頻度の高い文字を返す再帰メソッド (mostFrequentStartingLetter) を使用する必要があります...どこから始めればよいかわかりません.....

助けてください...

ありがとう、アロナ

あなたが知っているように、私は不正行為をしていません:

public class TextList {
    private WordNode _head;

    public TextList(String text) {
    String word = "";
    WordNode tmp;

    // After the split that in the array we are going over all the array
    for (int i = 0; i < text.length(); i++) {
        for (int j = 0; j < text.length(); j++) {
            if (text.charAt(j) == ' ') {
                word = text.substring(0, j);
                text = text.substring(j + 1);
                i = 0;
                break;
            } else if (j == text.length() - 1) {
                word = text.substring(0, j + 1);
                text = text.substring(j + 1);
                break;
            }
        }
        if (_head == null) {
            tmp = new WordNode(word, null);
            _head = tmp;
        }
        // if the word starts with a smalles letter then the head, make it
        // the head
        else if (_head.getWord().compareTo(word) > 0) {
            tmp = new WordNode(word, _head);
            _head = tmp;

        } else {
            WordNode current;
            current = _head;
            // go over all the nodes in the list and push the current word
            // to the list in the right order
            while (current.getNext() != null) {
                if (current.getWord().compareTo(word) < 1
                        && current.getNext().getWord().compareTo(word) > 0) {
                    tmp = new WordNode(word, current.getNext());
                    current.setNext(tmp);

                    break;
                }
                current = current.getNext();
            }
            // If the current was the tail, check that the word is bigger
            // and then make it the tail.
            if (current.getNext() == null
                    && current.getWord().compareTo(word) < 1) {
                tmp = new WordNode(word, null);
                current.setNext(tmp);

            }
        }
    }

    }

    public String mostFrequentWord() {

        String frequentWord = _head.getWord();
        WordNode current = _head;
        int count = 0;
        int max = 0;

        while (current.getNext() != null) {

            if (current.getWord().compareTo(current.getNext().getWord()) == 0) {
                count++;
            }

            if (count > max) {
                max = count; frequentWord = current.getWord();
            }

            current = current.getNext();
        }

        return frequentWord;
    }

    public String toString() {

        String s = "";
        WordNode current = _head;
        int count = 1;

        while (current != null) {
            while (current.getNext() != null && current.getWord().equals(current.getNext().getWord())) {

                count++;
                current = current.getNext();
            }

            s += current.getWord() + "\t" + count + "\n";
            count = 1;
            current = current.getNext();
        }
        return s;
    }

    public char mostFrequentStartingLetter(....){}
}
4

1 に答える 1

2

これは宿題なので、ヒントだけを教えます。

ここで行う必要があることは 2 つあります。

  • リンクされたリストを再帰的に繰り返します。
  • 開始文字を追跡します。

再帰関数がある場合、停止条件が必要です。リンクされたリストの停止条件について考えてください。リンクされたリストの最後に到達したことをどのように知ることができますか? の値は何でしょう_nextか?

メソッドは次のようになります。

///The pieces in the angle brackets are for you to figure out.
public void determineStartingLetter(WordNode currentNode) {
    if(!<stopping condition>) {
        determineStartingLetter(<next node after currentNode>);
    }
}

現在、これはリンクされたリストのみをトラバースします。また、これまでに見た開始文字を追跡する必要もあります。そのために使用できる構造について考えてみてください。キャラクターをあなたが見た回数にマッピングしたいとします。どのデータ構造があなたのためにそれをしますか?

どこでそのような構造を維持できますか? 最も簡単な解決策 (ただし、最も保守しやすくエレガントではない) は、TextListクラスのプライベート メンバーです。しかし、もっと良い方法があります。このデータ構造を単純に再帰メソッドに渡してから、すべての再帰呼び出しに渡すことができるとしたら?

したがって、メソッドは次のようになります。

//As before, the things in angle brackets are for you to figure out.
public <data structure> determineStartingLetter(WordNode currentNode, <data structure>) {
    if(!stopping condition>) {
        <look at starting letter for currentNode>
        <increment the count for this letter in the data structure>
        return determineStartingLetter(<next node after currentNode>, <data structure>);
    }

    return <data structure>
}

これは、それを行う方法を理解するのに十分なヒントを与えるはずです. 2 番目の部分では、実際には必要以上のヒントを提供しました :)。

于 2013-05-16T19:51:55.910 に答える