【问题标题】:Count words in a string method?用字符串方法计算单词?
【发布时间】:2011-08-17 09:00:19
【问题描述】:

我想知道如何编写一个方法来仅通过使用 charAt、length 或 substring 等字符串方法来计算 java 字符串中的单词数。

循环和 if 语句都可以!

我非常感谢我能得到的任何帮助!谢谢!

【问题讨论】:

  • 不,只是一些额外的字符串练习!谢谢老哥!
  • @user667926:那么,祝你好运!

标签: java string methods count


【解决方案1】:

即使有多个空格和前导和/或尾随空格和空行,这也可以工作:

String trim = s.trim();
if (trim.isEmpty())
    return 0;
return trim.split("\\s+").length; // separate string around spaces

希望对您有所帮助。有关拆分的更多信息here.

【讨论】:

  • 小修正。最后一行应该是return words.length;
  • 我会在这里使用 \\W 而不是 \\s,因为您可以使用空格分隔单词以外的其他内容。
  • 简短、甜美、有效。
  • 如果字符串中只有一个单词,上述代码中的 @Trejkaz \\w 将返回 0。哪个不正确
【解决方案2】:
public static int countWords(String s){

    int wordCount = 0;

    boolean word = false;
    int endOfLine = s.length() - 1;

    for (int i = 0; i < s.length(); i++) {
        // if the char is a letter, word = true.
        if (Character.isLetter(s.charAt(i)) && i != endOfLine) {
            word = true;
            // if char isn't a letter and there have been letters before,
            // counter goes up.
        } else if (!Character.isLetter(s.charAt(i)) && word) {
            wordCount++;
            word = false;
            // last word of String; if it doesn't end with a non letter, it
            // wouldn't count without this.
        } else if (Character.isLetter(s.charAt(i)) && i == endOfLine) {
            wordCount++;
        }
    }
    return wordCount;
}

【讨论】:

  • 您需要考虑撇号和引号以及其他特殊字符。
  • 您在 cmets 中使用了缩略词(“isn't”、“doesn't”、“wouldn't”),但您的代码无法处理它们。它也不会处理打击犯罪的犬科动物。
【解决方案3】:
 private static int countWordsInSentence(String input) {
    int wordCount = 0;

    if (input.trim().equals("")) {
        return wordCount;
    }
    else {
        wordCount = 1;
    }

    for (int i = 0; i < input.length(); i++) {
        char ch = input.charAt(i);
        String str = new String("" + ch);
        if (i+1 != input.length() && str.equals(" ") && !(""+ input.charAt(i+1)).equals(" ")) {
            wordCount++;
        }
    }

    return wordCount;
 }

【讨论】:

    【解决方案4】:

    使用

    myString.split("\\s+");
    

    这会起作用。

    【讨论】:

      【解决方案5】:

      O(N) 中的算法

       count : 0;
      
       if(str[0] == validChar ) :
            count++;
       else :
            for i = 1 ; i < sizeOf(str) ; i++ :
      
                if(str[i] == validChar AND str[i-1] != validChar)
      
                   count++;
      
                end if;
      
            end for;
      
       end if;
      
       return count;
      

      【讨论】:

        【解决方案6】:
        public static int countWords(String str){
                if(str == null || str.isEmpty())
                    return 0;
        
                int count = 0;
                for(int e = 0; e < str.length(); e++){
                    if(str.charAt(e) != ' '){
                        count++;
                        while(str.charAt(e) != ' ' && e < str.length()-1){
                            e++;
                        }
                    }
                }
                return count;
            }
        

        【讨论】:

          【解决方案7】:
          public class TestStringCount {
          
            public static void main(String[] args) {
              int count=0;
              boolean word= false;
              String str = "how ma ny wo rds are th ere in th is sente nce";
              char[] ch = str.toCharArray();
              for(int i =0;i<ch.length;i++){
                  if(!(ch[i]==' ')){
                      for(int j=i;j<ch.length;j++,i++){
                          if(!(ch[j]==' ')){
                              word= true;
                              if(j==ch.length-1){
                                  count++;
                              }
                              continue;
                          }
                          else{
                              if(word){
                                  count++;
                              }
                              word = false;
                          }
                      }
                  }
                  else{
                      continue;
                  }
              }
              System.out.println("there are "+(count)+" words");      
              }
          }
          

          【讨论】:

            【解决方案8】:
                import com.google.common.base.Optional;
                import com.google.common.base.Splitter;
                import com.google.common.collect.HashMultiset;
                import com.google.common.collect.ImmutableSet;
                import com.google.common.collect.Multiset;
            
                String str="Simple Java Word Count count Count Program";
                Iterable<String> words = Splitter.on(" ").trimResults().split(str);
            
            
                //google word counter       
                Multiset<String> wordsMultiset = HashMultiset.create();
                for (String string : words) {   
                    wordsMultiset.add(string.toLowerCase());
                }
            
                Set<String> result = wordsMultiset.elementSet();
                for (String string : result) {
                    System.out.println(string+" X "+wordsMultiset.count(string));
                }
            
            
            add at the pom.xml
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>r09</version>
            </dependency>
            

            【讨论】:

              【解决方案9】:

              计算字符串中的单词:
              这可能也有帮助 -->

              package data.structure.test;
              import java.io.BufferedReader;
              import java.io.IOException;
              import java.io.InputStreamReader;
              public class CountWords {
              
                  public static void main(String[] args) throws IOException {
              // Couting number of words in a string
                      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                      System.out.println("enter Your String");
                      String input = br.readLine(); 
              
                      char[] arr = input.toCharArray();
                      int i = 0;
                  boolean notCounted = true;
                  int counter = 0;
                  while (i < arr.length) {
                      if (arr[i] != ' ') {
                          if (notCounted) {
                              notCounted = false;
                              counter++;
                          }
                      } else {
                          notCounted = true;
                      }
                      i++;
                  }
                  System.out.println("words in the string are : " + counter);
              }
              
              }
              

              【讨论】:

              • 您确实需要在基本代码之外添加某种解释。
              • 我不确定要添加什么。我认为代码本身很容易解释。
              【解决方案10】:

              简单地使用,

              str.split("\\w+").length ;
              

              【讨论】:

              • 我必须指出,这在很多情况下都不能正常工作,因为它有很多赞成票。 " ".split("\\w+").length 产生 1(空或空白字符串)。 " a ".split("\\w+").length yiedls 2(一个单词,尾随空格)
              【解决方案11】:
              if(str.isEmpty() || str.trim().length() == 0){
                 return 0;
              }
              return (str.trim().split("\\s+").length);
              

              【讨论】:

                【解决方案12】:

                您好,我刚刚想出了这样的 StringTokenizer:

                String words = "word word2 word3 word4";
                StringTokenizer st = new Tokenizer(words);
                st.countTokens();
                

                【讨论】:

                • 这可行,但它不是 String 方法,它使用单独的 StringTokenizer 类。问题是如何在不使用其他类的情况下做到这一点。
                • 我喜欢这个答案。最初问这个问题的人可能无论如何都得到了一些家庭作业的答案。想想看,你的第二行需要是: StringTokenizer st = new StringTokenizer(words);
                【解决方案13】:

                导入 java.util.; 导入 java.io.;

                公共类主{

                public static void main(String[] args) {
                
                    File f=new File("src/MyFrame.java");
                    String value=null;
                    int i=0;
                    int j=0;
                    int k=0;
                try {
                    Scanner  in =new Scanner(f);
                    while(in.hasNextLine())
                    {
                    String a=in.nextLine();
                    k++; 
                    char chars[]=a.toCharArray();
                    i +=chars.length;
                    }
                    in.close();
                    Scanner in2=new Scanner(f);
                    while(in2.hasNext())
                            {
                
                        String b=in2.next();
                        System.out.println(b);
                        j++;
                            }
                   in2.close();
                
                    System.out.println("the number of chars is :"+i);
                    System.out.println("the number of words is :"+j);
                    System.out.println("the number of lines is :"+k);
                
                
                
                
                
                }
                catch (Exception e) {
                    e.printStackTrace();
                
                }
                
                
                }
                

                }

                【讨论】:

                  【解决方案14】:

                  有一个简单的解决方案你可以试试这个代码

                      String s = "hju   vg    jhdgsf  dh gg    g g  g  ";
                  
                      String[] words = s.trim().split("\\s+");
                  
                      System.out.println("count is = "+(words.length));
                  

                  【讨论】:

                    【解决方案15】:
                    public static int countWords(String input) {
                            int wordCount = 0;
                            boolean isBlankSet = false;
                            input = input.trim();
                    
                            for (int j = 0; j < input.length(); j++) {
                                if (input.charAt(j) == ' ')
                                    isBlankSet = true;
                                else {
                                    if (isBlankSet) {
                                        wordCount++;
                                        isBlankSet = false;
                                    }
                                }
                    
                            }
                    
                            return wordCount + 1;
                        }
                    

                    【讨论】:

                    • 不要只发布代码答案。添加一些上下文。
                    【解决方案16】:

                    我对那个程序的想法是:

                    package text;
                    import java.io.BufferedReader;
                    import java.io.IOException;
                    import java.io.InputStreamReader;
                    
                    public class CoutingWords {
                    
                        public static void main(String[] args) throws IOException {
                            String str;
                            int cWords = 1;
                            char ch;
                    
                            BufferedReader buffor = new BufferedReader(new InputStreamReader(System.in));
                    
                            System.out.println("Enter text: ");
                            str = buffor.readLine();
                    
                            for(int i =0; i<str.length(); i++){
                                ch = str.charAt(i);
                                if(Character.isWhitespace(ch)){ cWords++; }
                            }
                            System.out.println("There are " + (int)cWords +" words.");
                        }
                    }
                    

                    【讨论】:

                      【解决方案17】:

                      我是 stackoverflow 的新手,但我希望我的代码能有所帮助:

                      private int numOfWordsInLineCounter(String line){
                      
                           int words = 0;
                      
                               for(int i = 1 ; i<line.length();i++){
                               Character ch  = line.charAt(i-1);
                               Character bch = line.charAt(i);
                                   if(Character.isLetterOrDigit(ch) == true && Character.isLetterOrDigit(bch)== false ) words++;
                                   if(i == line.length()-1 && Character.isLetterOrDigit(bch))words++;
                               }
                           return words;
                       } 
                      

                      【讨论】:

                        【解决方案18】:

                        字符串短语通常包含用空格分隔的单词。好吧,您可以使用空格作为分隔字符来拆分短语,然后按如下方式计算它们。

                        import java.util.HashMap;
                        
                        import java.util.Map;
                        
                        public class WordCountMethod {
                        
                            public static void main (String [] args){
                        
                                Map<String, Integer>m = new HashMap<String, Integer>();
                                String phrase = "hello my name is John I repeat John";
                                String [] array = phrase.split(" ");
                        
                                for(int i =0; i < array.length; i++){
                                    String word_i = array[i];
                                    Integer ci = m.get(word_i);
                                    if(ci == null){
                                        m.put(word_i, 1);
                                    }
                                    else m.put(word_i, ci+1);
                                }
                        
                                for(String s : m.keySet()){
                                    System.out.println(s+" repeats "+m.get(s));
                                }
                            }
                        
                        } 
                        

                        【讨论】:

                          【解决方案19】:

                          以所选答案为起点,以下处理一些英语语言问题,包括连字符、所有格和缩写的撇号、数字以及 UTF-16 之外的任何字符:

                          public static int countWords(final String s) {
                              int wordCount = 0;
                              boolean word = false;
                              final int endOfLine = s.length() - 1;
                          
                              for (int i = 0; i < s.length(); i++) {
                                  // if the char is a letter, word = true.
                                  if (isWordCharacter(s, i) && i != endOfLine) {
                                      word = true;
                                      // if char isn't a letter and there have been letters before,
                                      // counter goes up.
                                  } else if (!isWordCharacter(s, i) && word) {
                                      wordCount++;
                                      word = false;
                                      // last word of String; if it doesn't end with a non letter, it
                                      // wouldn't count without this.
                                  } else if (isWordCharacter(s, i) && i == endOfLine) {
                                      wordCount++;
                                  }
                              }
                              return wordCount;
                          }
                          
                          private static boolean isWordCharacter(final String s, final int i) {
                              final char ch = s.charAt(i);
                              return Character.isLetterOrDigit(ch)
                                      || ch == '\''
                                      || Character.getType(ch) == Character.DASH_PUNCTUATION
                                      || Character.isSurrogate(ch);
                          }
                          

                          【讨论】:

                            【解决方案20】:

                            我只是把它放在一起。 wordCount() 方法中的增量器对我来说有点不雅,但它确实有效。

                            import java.util.*;
                            
                            public class WordCounter {
                            
                            private String word;
                            private int numWords;
                            
                            public int wordCount(String wrd) {
                                StringTokenizer token = new StringTokenizer(wrd, " ");
                                word = token.nextToken();
                                numWords = token.countTokens();
                                numWords++;
                            
                                return numWords;
                            }
                            
                            public static void main(String[] args) {
                            
                                Scanner input = new Scanner(System.in);
                            
                                String userWord;
                            
                                WordCounter wc = new WordCounter();
                            
                                System.out.println("Enter a sentence.");
                                userWord = input.nextLine();
                            
                                wc.wordCount(userWord);
                            
                                System.out.println("You sentence was " + wc.numWords + " words long.");
                              }
                            }
                            

                            【讨论】:

                              【解决方案21】:
                                  String a = "Some String";
                                  int count = 0;
                                  for (int i = 0; i < a.length(); i++) {
                              
                                      if (Character.isWhitespace(a.charAt(i))) {
                                          count++; 
                                      }
                                  }
                                  System.out.println(count+1);
                              

                              它将计算空白。但是,如果我们在 count 中加 1,我们可以得到准确的单词。

                              【讨论】:

                                【解决方案22】:

                                创建变量计数,状态。初始化变量
                                如果存在空间,请保持计数,否则增加计数。 例如:

                                if (string.charAt(i) == ' ' ) {
                                state = 0;
                                } else if (state == 0) {
                                state = 1;
                                count += 1;
                                

                                【讨论】:

                                  【解决方案23】:

                                  lambda,其中省略了对计数单词的拆分和存储
                                  并且完成计数

                                  String text = "counting w/o apostrophe's problems or consecutive   spaces";
                                  
                                  int count = text.codePoints().boxed().collect(
                                      Collector.of(
                                          () -> new int[] {0, 0},
                                          (a, c) -> {
                                            if( ".,; \t".indexOf( c ) >= 0 )
                                              a[1] = 0;
                                            else if( a[1]++ == 0 ) a[0]++;
                                          }, (a, b) -> {a[0] += b[0]; return( a );},
                                          a -> a[0] ) );
                                  

                                  获取:7
                                  用作状态机,计算从空格字符 .,; \t 到单词的转换

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2018-11-07
                                    • 2017-03-22
                                    • 2023-03-21
                                    相关资源
                                    最近更新 更多