Подсчитывать слова в строковом методе?

#java #string #methods #count

#java #строка #методы #подсчитывать

Вопрос:

Мне было интересно, как бы я написал метод для подсчета количества слов в строке Java только с использованием строковых методов, таких как charAt, length или substring .

Циклы и операторы if в порядке!

Я действительно ценю любую помощь, которую я могу получить! Спасибо!

Ответ №1:

Это будет работать даже с несколькими пробелами, начальными и / или конечными пробелами и пустыми строками:

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

Подробнее о сплите здесь.

Комментарии:

1. Небольшая поправка. Последняя строка должна быть return words.length;

2. Я бы использовал \ W здесь вместо \ s , потому что вы могли бы использовать что-то другое, кроме пробела, разделяющего слова.

3. Короткий, приятный и эффективный.

4. @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)) amp;amp; 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)) amp;amp; 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)) amp;amp; i == endOfLine) {
            wordCount  ;
        }
    }
    return wordCount;
}
  

Комментарии:

1. Вам нужно учитывать апострофы, кавычки и другие специальные символы.

2. Вы используете сокращения в своих комментариях («не является», «не делает», «не стал бы»), но ваш код не может их обработать. Он также не будет обрабатывать собак, борющихся с преступностью.

Ответ №3:

Привет, я только что разобрался с StringTokenizer следующим образом:

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

Комментарии:

1. Это работает, но это не строковый метод, он использует отдельный класс StringTokenizer. Вопрос в том, как это сделать без использования других классов.

2. Мне нравится этот ответ. Человек, который изначально задал этот вопрос, вероятно, в любом случае получал ответ на какое-то домашнее задание. Если подумать, ваша вторая строка должна быть: StringTokenizer st = новый StringTokenizer (слова);

Ответ №4:

Просто используйте ,

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

Комментарии:

1. Я должен отметить, что во многих случаях это работает некорректно, поскольку имеет ряд положительных отзывов. " ".split("\w ").length выдает 1 (пустая строка). " a ".split("\w ").length yiedls 2 (одно слово с конечными пробелами)

Ответ №5:

 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) != ' ' amp;amp; e < str.length()-1){
                    e  ;
                }
            }
        }
        return count;
    }
  

Ответ №6:

  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() amp;amp; str.equals(" ") amp;amp; !(""  input.charAt(i 1)).equals(" ")) {
            wordCount  ;
        }
    }

    return wordCount;
 }
  

Ответ №7:

Использовать

 myString.split("\s ");
  

Это сработает.

Ответ №8:

Есть простое решение, вы можете попробовать этот код

     String s = "hju   vg    jhdgsf  dh gg    g g  g  ";

    String[] words = s.trim().split("\s ");

    System.out.println("count is = " (words.length));
  

Ответ №9:

 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;
    }
  

Комментарии:

1. Не публикуйте ответы только с кодом. Добавьте некоторый контекст.

Ответ №10:

Алгоритм в 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;
  

Ответ №11:

     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>
  

Ответ №12:

Подсчет слов в строке:
это также может помочь —>

 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);
}

}
  

Комментарии:

1. Вам действительно нужно добавить какое-то объяснение помимо простого базового кода.

2. я не уверен, что добавить. я думаю, что сам код говорит сам за себя.

Ответ №13:

 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");      
    }
}
  

Ответ №14:

импортировать java.util.; импортировать java.io.;

открытый класс Main {

 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();

}


}
  

}

Ответ №15:

Моя идея этой программы заключается в том, что:

 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.");
    }
}
  

Ответ №16:

Я новичок в 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 amp;amp; Character.isLetterOrDigit(bch)== false ) words  ;
             if(i == line.length()-1 amp;amp; Character.isLetterOrDigit(bch))words  ;
         }
     return words;
 } 
  

Ответ №17:

Строковая фраза обычно содержит слова, разделенные пробелом. Ну, вы можете разделить фразу, используя пробелы в качестве разделяющих символов, и посчитать их следующим образом.

 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));
        }
    }

} 
  

Ответ №18:

Принимая выбранный ответ за отправную точку, ниже рассматриваются несколько проблем английского языка, включая перенос слов, апострофы для притяжательных и сокращения, цифры, а также любые символы за пределами 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) amp;amp; i != endOfLine) {
            word = true;
            // if char isn't a letter and there have been letters before,
            // counter goes up.
        } else if (!isWordCharacter(s, i) amp;amp; 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) amp;amp; 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);
}
  

Ответ №19:

Я только что собрал это вместе. Увеличитель в методе 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.");
  }
}
  

Ответ №20:

создайте переменную count, state. инициализировать переменные
если присутствует пробел, продолжайте считать, поскольку в противном случае увеличивайте количество. например:

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

Ответ №21:

и
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 к словам

Ответ №22:

 if(str.isEmpty() || str.trim().length() == 0){
   return 0;
}
return (str.trim().split("\s ").length);
  

Ответ №23:

     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);
  

Он будет подсчитывать пробелы. Однако, если мы добавим 1 в count , мы сможем получить точные слова.