-3

これは、Javaを使用した単語カウントプログラムです。これを再プログラムして、何か、何か; なにか?なにか!何かが 1 つの単語としてカウントされます。つまり、大文字と小文字や句読点に関係なく、同じ単語を 2 回カウントするべきではありません。

import java.util.Scanner;
public class WordCount1
{
    public static void main(String[]args)
    {
        final int Lines=6;
        Scanner in=new Scanner (System.in);
        String paragraph = "";
        System.out.println( "Please input "+ Lines + " lines of text.");
        for (int i=0; i < Lines; i+=1)
        {
            paragraph=paragraph+" "+in.nextLine();
        }
        System.out.println(paragraph);
        String word="";
        int WordCount=0;
        for (int i=0; i<paragraph.length()-1; i+=1)
        {
            if (paragraph.charAt(i) != ' ' || paragraph.charAt(i) !=',' || paragraph.charAt(i)    !=';' || paragraph.charAt(i) !=':' )
            {
                word= word + paragraph.charAt(i);
                if(paragraph.charAt(i+1)==' ' || paragraph.charAt(i) ==','|| paragraph.charAt(i) ==';' || paragraph.charAt(i) ==':')
                {
                    WordCount +=1;
                    word="";
                }
            }
        }
        System.out.println("There are "+WordCount +" words ");
    }
}
4

8 に答える 8

3

これは宿題なので、ここにいくつかのヒントとアドバイスがあります。

  • String.split正規表現として指定されたセパレーターを使用して、文字列をパーツに分割するという巧妙な小さなメソッドがあります。正しく使用すれば、「単語数」の問題を 1 行で解決できます。(分割を使用しないように言われた場合は、それを無視してかまいません...ただし、経験豊富な Java 開発者が最初に検討する単純な解決策です。)

  • 他の人に見せる前に、コードを適切にフォーマット/インデントしてください。あなたのインストラクターがこれについて減点しない場合、彼/彼女は自分の仕事を適切に行っていません.

  • 標準の Java 命名規則を使用します。の大文字と小文字Linesが正しくありません。LINESマニフェスト定数または変数の場合がlinesありますが、大文字で始まる大文字と小文字が混在する名前は常にクラス名にする必要があります。

  • 演算子 (代入演算子を含む) の前後の空白文字の使用に一貫性を持たせてください。

  • ユーザーが提供しなければならない入力行数をハードワイヤするのは、悪い考えです (完全に不必要です)。また、彼/供給が6行未満の場合は扱っていません。

于 2012-08-02T01:02:25.587 に答える
1

どうぞ。これは動作します。コメントを読むだけで、フォローできるはずです。

import java.util.Arrays;
import java.util.HashSet;
import javax.swing.JOptionPane;

// Program Counts Words In A Sentence. Duplicates Are Not Counted.
public class WordCount
{
    public static void main(String[]args)
    {
        // Initialize Variables
        String sentence = "";
        int wordCount = 1, startingPoint = 0;


        // Prompt User For Sentence
        sentence = JOptionPane.showInputDialog(null, "Please input a sentence.", "Input Information Below", 2);


        // Remove All Punctuations. To Check For More Punctuations Just Add Another Replace Statement.
        sentence = sentence.replace(",", "").replace(".", "").replace("?", "");


        // Convert All Characters To Lowercase - Must Be Done To Compare Upper And Lower Case Words.
        sentence = sentence.toLowerCase();


        // Count The Number Of Words
        for (int i = 0; i < sentence.length(); i++)
            if (sentence.charAt(i) == ' ')
                wordCount++;


        // Initialize Array And A Count That Will Be Used As An Index
        String[] words = new String[wordCount];
        int count = 0;


        // Put Each Word In An Array
        for (int i = 0; i < sentence.length(); i++)
        {
            if (sentence.charAt(i) == ' ')
            {
                words[count] = sentence.substring(startingPoint,i);
                startingPoint = i + 1;
                count++;
            }
        }


        // Put Last Word In Sentence In Array
        words[wordCount - 1] = sentence.substring(startingPoint, sentence.length());


        // Put Array Elements Into A Set. This Will Remove Duplicates
        HashSet<String> wordsInSet = new HashSet<String>(Arrays.asList(words));


        // Format Words In Hash Set To Remove Brackets, And Commas, And Convert To String
        String wordsString = wordsInSet.toString().replace(",", "").replace("[", "").replace("]", "");


        // Print Out None Duplicate Words In Set And Word Count
        JOptionPane.showMessageDialog(null, "Words In Sentence:\n" + wordsString + " \n\n" +
                                                "Word Count: " + wordsInSet.size(), "Sentence Information", 2);
    }
}
于 2012-08-02T03:03:10.227 に答える
1

さらに処理を行う前に、句読点を削除して単一のケースに変更する必要があります。(ロケールとユニコードに注意してください)

入力を単語に分割したら、それらを Set に渡し、セットのサイズを確認することで、一意の単語の数を数えることができます。

于 2012-08-02T00:55:09.433 に答える
0

入力文字列を解析するときは、単語ごとにマップ データ構造に格納します。その「単語」、「単語?」を確認してください。"語!" すべてがキー「単語」とともにマップに保存され、マップに追加する必要があるたびに単語のカウントがインクリメントされます。

于 2012-08-03T18:13:02.887 に答える
0

無視したいマーク (;、?、!) がわかっている場合String.replaceは、単語から文字を簡単に削除できます。あなたは使用String.startsWithString.endsWithて助けたいと思うかもしれません

一致しやすいように値を小文字に変換します ( String.toLowercase)

「セット」の使用は優れたアイデアです。特定の単語が何回出現するかを知りたい場合は、Mapある種のを利用することもできます

于 2012-08-02T00:59:15.187 に答える
0
  1. すべての句読点を削除
  2. すべての文字列を小文字または大文字に変換します
  3. それらの文字列をセットに入れます
  4. セットのサイズを取得する
于 2012-08-02T00:59:57.113 に答える
0
  1. 句読点を取り除く必要があります。ここに1つのアプローチがあります:文字列を文字ごとに翻訳する

  2. 上記を使用してケースを正規化することもできますが、そうするための他のユーティリティがおそらくあります。

  3. これで、記述したすべてのバリエーションが同じ文字列に変換されるため、そのように認識されます。他のほとんどの人が示唆しているように、 as set は、異なる単語の数を数えるのに適したツールです。

于 2012-08-02T01:00:52.550 に答える
0

あなたの本当の問題は、個別の単語数を持ちたいということです。そのため、すでに遭遇した単語を追跡するか、テキストから完全に削除する必要があります。

最初の単語を選択し、既に遭遇した単語をリストに保存すると、その単語を既に見たかどうかをそのリストと照合して確認できます。

List<String> encounteredWords = new ArrayList<String>();
// continue after that you found out what the word was
if(!encounteredWords.contains(word.toLowerCase()){
    encounteredWords.add(word.toLowerCase());
    wordCount++;
}

しかし、Antimony も興味深い発言をしています。彼は Set のプロパティを使用して、個別のワードカウントが何であるかを確認しています。セットには重複を含めることはできないと定義されているため、同じ単語をさらに追加しても、セットのサイズは大きくなりません。

Set<String> wordSet = new HashSet<String>();
// continue after that you found out what the word was
wordSet.add(word.toLowerCase());
// continue after that you scanned trough all words
return wordSet.size();
于 2012-08-02T01:03:36.087 に答える