-3

这是我使用java的字数统计程序。我需要重新编程,这样某事,某事;某物?某物!有些东西算作一个词。这意味着无论大小写和标点符号如何,它都不应该将同一个单词计算两次。

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将字符串拆分为多个部分,使用指定为正则表达式的分隔符。如果您以正确的方式使用它,这将为您提供“字数统计”问题的单行解决方案。(如果你被告知不要使用 split,你可以忽略它......尽管这是一个经验丰富的 Java 开发人员首先会考虑的简单解决方案。)

  • 正确格式化/缩进你的代码......在你展示给其他人之前。如果你的导师没有为此扣分,他/她就没有做好他的工作。

  • 使用标准 Java 命名约定。的大小写Lines不正确。它可以LINES用于清单常量或lines变量,但以大写字母开头的混合大小写名称应始终是类名。

  • 在运算符(包括赋值运算符)周围使用空格字符时要保持一致。

  • 硬连线用户必须提供的输入行数是一个坏主意(而且完全没有必要)。而且您没有处理他/供应少于 6 行的情况。

于 2012-08-02T01:02:25.587 回答
1

在进行进一步处理之前,您应该删除标点符号并更改为单个大小写。(注意语言环境和 unicode)

将输入分解为单词后,您可以通过将它们传递到 Set 并检查集合的大小来计算唯一单词的数量。

于 2012-08-02T00:55:09.433 回答
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 回答
0

你真正的问题是,你想要一个 Distinct wordcount,所以,你应该跟踪已经遇到的单词,或者从文本中完全删除它们。

假设您选择第一个,并将您已经遇到的单词存储在列表中,然后您可以检查该列表是否已经看到该单词。

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 回答
0

在解析输入字符串时,将其逐字存储在地图数据结构中。只需确保“字”、“字?” “单词!” 所有内容都与地图中的“单词”键一起存储,并在您必须添加到地图时增加单词的计数。

于 2012-08-03T18:13:02.887 回答
0

如果您知道要忽略的标记 (;, ?, !),您可以简单String.replace地从单词中删除字符。您可能想使用String.startsWithString.endsWith帮助

将您的值转换为小写以便于匹配 ( String.toLowercase)

使用“Set”是一个绝妙的主意。如果您想知道某个特定单词出现了多少次,您还可以利用Map某种

于 2012-08-02T00:59:15.187 回答
0
  1. 删除所有标点符号
  2. 将所有字符串转换为小写或大写
  3. 把这些字符串放在一组
  4. 获取集合的大小
于 2012-08-02T00:59:57.113 回答
0
  1. 你需要去掉标点符号;这是一种方法:逐字符翻译字符串

  2. 上述内容也可用于规范化案例,尽管可能还有其他实用程序可以这样做。

  3. 现在,您描述的所有变体都将转换为相同的字符串,因此可以被识别。正如几乎所有其他人所建议的那样, set 将是计算不同单词数量的好工具。

于 2012-08-02T01:00:52.550 回答