0

配列を使用して、テキスト ファイル内で繰り返される単語をカウントするにはどうすればよいですか?

私のプログラムはファイル内の単語の総数を出力できますが、プログラムに異なる単語の数を出力させ、次のように繰り返される単語の数のリストを出力させるにはどうすればよいですか。

ケーキ: 4 a: 320 ピース: 2 の 24

   (大文字と小文字の単語は同じ単語と見なされます)

void FileReader() { 


    System.out.println("Oppgave A");
    int totalWords = 0; 
    int uniqueWords = 0; 
    String [] word = new String[35000];
    String [] wordC = new String [3500];
    try {
        File fr = new File("Alice.txt");
        Scanner sc = new Scanner (fr);

        while(sc.hasNext()){
        String words = sc.next();
        String[] space = words.split(" ");
        String[] comma = words.split(",");
            totalWords++;


            }
        System.out.println("Antall ord som er lest er: " + totalWords);         
    } catch (Exception e) {

        System.out.println("File not found");

    }
4

6 に答える 6

2

これは配列では非常に非効率的です。各単語の後で、その単語が既に出現しているかどうかを確認するために配列を反復処理する必要があるからです。代わりに、キーが単語、値が出現回数である HashMap を使用します。配列に要素が含まれているかどうかを確認するよりも、HashMap にキーが含まれているかどうかを確認する方が簡単で高速です。

編集:

HashMap<String, Integer>
于 2013-11-12T10:52:10.340 に答える
1

セットを使用して、反復を使用して戻り値を確認してみてください。

Set<String> set = new HashSet(Arrays.asList(word));
int unique = 0;
for (String temp : word) {
    if (set.add(temp)) {
        unique++;
    }
}

//or...
Set<String> set = new HashSet(Arrays.asList(word));
int unique = set.size();

もちろん、これはすべての値が既にインポートされた後です。

編集:マップを使用できない(および他のデータ構造を想定している)ことを確認すると、すべての値をチェックするやや大雑把な方法を実行する必要がある場合があります。

//get a new word from the text file
boolean isUnique = true;
//for every word in your array; input == your new word
    if (word.equalsIgnoreCase(input)) {
        unique = false
    }
//end loop
if (isUnique) {
    unique++; // Assuming unique is the count of unique words
}
于 2013-11-12T10:52:47.880 に答える
1

マップに既にある単語を追加するたびにマップを使用して、値を増やします (カウント)

于 2013-11-12T10:53:09.513 に答える
0

Arrays.sortおよびArrays.binarySearchを使用して、単純な配列検索を改善できます。

基本的に、単語ごとに、それが既に配列にあるかどうかを で確認しますbinarySearch。そうであれば、カウントを増やします。そうでない場合は、配列に追加して再度並べ替えます。配列がすでにほとんどソートされている場合、現在の Java ソート アルゴリズムは非常に高速です。TimSortを使用します。

TreeSetハッシュの使用を避けるために使用できる他の構造もありますが、それも許可されていないと思います。

于 2013-11-12T11:27:10.803 に答える
0

これを試して:

 try {
            List<String> list = new ArrayList<String>();
            int totalWords = 0;
            int uniqueWords = 0;
            File fr = new File("Alice.txt");
            Scanner sc = new Scanner(fr);
            while (sc.hasNext()) {
                String words = sc.next();
                String[] space = words.split(" ");
                for (int i = 0; i < space.length; i++) {
                    list.add(space[i]);
                }
                totalWords++;
            }
            System.out.println("Words with their frequency..");
            Set<String> uniqueSet = new HashSet<String>(list);
            for (String word : uniqueSet) {
                System.out.println(word + ": " + Collections.frequency(list,word));
            }
        } catch (Exception e) {

            System.out.println("File not found");

        }
于 2013-11-12T11:04:04.247 に答える
0

単語を追加するたびに、その単語が配列に既に存在するかどうかを確認する必要があります。比較するには、次を使用する必要があります。

 word1.equalsIgnoreCase(word2);
于 2013-11-12T10:54:23.957 に答える