用字符串方法计算单词?

Posted

技术标签:

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

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

循环和 if 语句都可以!

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

【问题讨论】:

不,只是一些额外的字符串练习!谢谢老哥! @user667926:那么,祝你好运! 【参考方案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】:

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

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 到单词的转换

【讨论】:

以上是关于用字符串方法计算单词?的主要内容,如果未能解决你的问题,请参考以下文章

php截取字符串函数(不打断英文单词)的方法

如何使用 Perl 计算文件中的字符、单词和行数?

在不使用正则表达式的情况下,在NSString中计算单词数量的最有效方法是什么?

计算字符串中的单词

如何计算文本字符串中的单词?

将 Set<String> 的内容放入单个字符串的最快方法,其中单词用空格分隔?