0

以下に概説するプログラミングの課題を解決しようとしています。基本的に、特定の文で繰り返し文字の数が最も多い単語を見つける必要があります。私はこれに少し苦労しましたが、幸運にも文字列内の文字の出現をカウントするためのコードを見つけることができました (以下も参照)。この特定のコードは、すべての文字を HashMap に格納するため、各単語の出現文字を個別に格納するように調整する必要があります (現在のように集約するのではなく)。これは私が立ち往生しているところです。ループの各反復で HashMap の状態を格納するには、何を使用できますか?

/* Using the Java language, have the function LetterCountI(str) take 
 * the str parameter being passed and return the first word with the 
 * greatest number of repeated letters. For example: "Today, is the 
 * greatest day ever!" should return greatest because it has 2 e's 
 * (and 2 t's) and it comes before ever which also has 2 e's. If there 
 * are no words with repeating letters return -1. Words will be 
 * separated by spaces. */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class OtherCountLetters {
    void countLetters2(String str) {
        String[] words = str.toLowerCase().split(" ");
        Map<Character, Integer> numChars = new HashMap<Character, Integer>();

        for (int i = 0; i < words.length; i++) {
            for (int j = 0; j < words[i].length(); j++) {
                char charAt = words[i].charAt(j);

                if (!numChars.containsKey(charAt)) {
                    numChars.put(charAt, 1);
                } else {
                    numChars.put(charAt, numChars.get(charAt) + 1);
                }
            }

        }

        System.out.println(numChars);
    }

    public static void main(String[] args) {
        OtherCountLetters ocl = new OtherCountLetters();
        ocl.countLetters2("Today is the greatest day ever");
    }

}

現時点では、「today is the great day ever」という文に対して、プログラムが返されます。

{v=1, g=1, d=2, e=5, t=4, s=2, r=2, a=3, o=1, h=1, y=2, i=1}

しかし、次のようなものを返す必要があります

{a=1, d=1, o=1, t=1, y=1} //'today'
{i=1, s=1}                //'is'
{e=1, h=1, t=1}           //'the'
{g=1, t=2, e=2, s=1, r=1, a=1} //'greatest'
{d=1, a=1, y=1}           //'day'
{v=1, e=2, r=1}           //'ever'

そうすれば、各エントリを繰り返し処理して最大値を持つエントリを確認し、対応する単語をユーザーに返すことができます。

ありがとう、

- - -編集 - -

これを投稿した後、私はひらめきの瞬間がありました:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class OtherCountLetters {
    void countLetters2(String str) {
        String[] words = str.toLowerCase().split(" ");
        String target = null;
        int largest = 0;
        Map<Character, Integer> numChars = new HashMap<Character, Integer>();

        for (int i = 0; i < words.length; i++) {
            for (int j = 0; j < words[i].length(); j++) {
                char charAt = words[i].charAt(j);

                if (!numChars.containsKey(charAt)) {
                    numChars.put(charAt, 1);
                } else {
                    numChars.put(charAt, numChars.get(charAt) + 1);
                }
                if (numChars.get(charAt) > largest) {
                    largest = numChars.get(charAt);
                    target = words[i];
                }
            }
            numChars.clear();
        }
        if (largest != 1) {
            System.out.println(target);
        } else {
            System.out.println("there are no words with 2 or more letters");
        }
    }

    public static void main(String[] args) {
        OtherCountLetters ocl = new OtherCountLetters();
        ocl.countLetters2("today is the greatest day ever and car");
    }

}
4

3 に答える 3

0

フレーズを単語に分割し、メソッド「OtherCountLetters」を使用してすべての単語を反復することを検討しましたか?

何も返さない代わりに、繰り返し文字の最高スコアを返すだけです。次に、ループで、現在の最大値と比較するだけです

ループの最後に、繰り返し文字が最も多いフレーズの単語を与えることができる場合があります

于 2015-05-14T03:24:25.900 に答える
0

そのはず:

public class OtherCountLetters {
    void countLetters2(String str) {
        Map<Character, Integer> numChars = new HashMap<Character, Integer>();
        for (int j = 0; j < str.length(); j++) {
             char charAt = str.charAt(j);

             if (!numChars.containsKey(charAt)) {
                 numChars.put(charAt, 1);
             } else {
                 numChars.put(charAt, numChars.get(charAt) + 1);
             }
         }

        System.out.println(numChars);
    }

    public static void main(String[] args) {
        OtherCountLetters ocl = new OtherCountLetters();
        String[] words = "Today is the greatest day ever".toLowerCase().split(" ");
        for (int i = 0; i < words.length; i++) {
            ocl.countLetters2(words[i]);
        }
    }

}
于 2015-05-14T03:25:32.053 に答える
0

あなたが自分の出力を取得している理由は、1 つのハッシュマップを使用してすべての単語をそこに格納しているためです。文の単語を配列に分割するという点で優れた仕事をしており、それらを必要に応じて正確に反復処理しています。ただし、1 日の終わりには、文字を 1 つのハッシュ テーブルに格納しているため、文のどの単語に何が含まれているかがわかりにくくなります。

私がすることは、単語を取り、最も頻繁な文字の繰り返し数である整数を返す関数を作成してソリューションを変更し、文内の各単語に対してこの関数を実行することです。次に、どの単語が最も多かったかを比較できます。

これが役に立ったことを願っています。明らかな理由から、ソリューションを修正するためのコードを提供したくありませんでした。(ああああの瞬間を奪いたくありませんでした。)

乾杯、 アンドリュー マルタ

于 2015-05-14T03:25:51.097 に答える