【问题标题】:Counting number of occurrences of word in java计算java中单词的出现次数
【发布时间】:2014-03-31 07:35:49
【问题描述】:

我想计算源字符串中特定单词的出现次数。 假设 src="thisisamangoterrthisismangorightthis?" 字=“这个” 所以我要做的是,首先在 src 中搜索单词的索引。它在索引 0 处。现在我正在从这个索引位置提取部分到 src 的末尾。 即,现在 src="isamangoterrthisismangorightthis?"并再次搜索单词。 但是我得到了数组超出范围的异常。

public static int countOccur(String s1, String s2)
{
    int ans=0;
    int len1=s1.length();
    int len2=s2.length();
    System.out.println("Lengths:"+len1+" " +len2);

    while(s1.contains(s2))
    {
        ans++;
        int tmpInd=s1.indexOf(s2);
        System.out.println("Now Index is:"+tmpInd);
        if((tmpInd+len2)<len1){
            s1=s1.substring(tmpInd+len2, len1);
            System.out.println("Now s1 is:"+s1);
        }
        else
            break;
    }
    return ans;

}

【问题讨论】:

  • 您永远不会重新计算 len1,因此它会保留第一个字符串的长度,即使 s1 变小,这也解释了您的异常。只需使用从给定索引到字符串末尾的 substring(int)。

标签: java string pattern-matching


【解决方案1】:

试试这个来计算字符串中的单词,

private static int countingWord(String value, String findWord)
    {
        int counter = 0;
        while (value.contains(findWord))
        {
            int index = value.indexOf(findWord);
            value = value.substring(index + findWord.length(), value.length());
            counter++;
        }
        return counter;
    }

【讨论】:

    【解决方案2】:

    当您使用抛出ArrayIndexOutOfBoundsException 的方法时,检查边界总是一个好主意。见String#substring:

    IndexOutOfBoundsException - 如果beginIndex 为负数,或者endIndex 大于此 String 对象的长度,或者beginIndex 是 大于endIndex


    您应该涵盖所有情况:

    if(tmpInd + len2 >= s1.length() || len1 >= s1.length() || ... ) {
        //Not good
    }
    

    或者,更好的是,您应该首先考虑您的逻辑以避免这种情况。

    【讨论】:

      【解决方案3】:

      尝试使用indexOf(),它会为您处理边界等问题:

      public static int countOccurrences(final String haystack, final String needle)
      {
          int index = 0;
          int ret = 0;
          while (true) {
              index = haystack.indexOf(needle, index);
              if (index == -1)
                  return ret;
              ret++;
          }
      
          // Not reached
          throw new IllegalStateException("How on earth did I get there??");
      }
      

      【讨论】:

        【解决方案4】:

        不要在你的字符串上使用substring,而是使用这个方法

        public int indexOf(int ch, int fromIndex)
        

        然后只需检查结果是否为-1

        【讨论】:

          【解决方案5】:

          您可能会使用替换来解决问题

          String s = "thisisamangoterrthisismangorightthis?";
          String newS = s.replaceAll("this","");
          int count = (s.length() - newS.length()) / 4;
          

          【讨论】:

          • 我喜欢这种方式 XD 但为"this" 放置一个变量并在计数计算中使用它;)
          • 使用.replace() 而不是.replaceAll(),因为您在此处替换了文字文本。与它的名字所暗示的不同,.replace() 确实 替换所有出现。但是首先,当存在不需要创建新字符串的解决方案时,为什么要这样做呢? ;)
          【解决方案6】:
          import java.io.*;
          import java.util.*;
          
          public class WordCount
          {
          public static class Word implements Comparable<Word>
          {
              String word;
              int count;
          
              @Override
              public int hashCode()
              {
                  return word.hashCode();
              }
          
              @Override
              public boolean equals(Object obj)
              {
                  return word.equals(((Word)obj).word);
              }
          
              @Override
              public int compareTo(Word b)
              {
                  return b.count - count;
              }
          }
          
          
              public  static void findWordcounts(File input)throws Exception
              {
                 long time = System.currentTimeMillis();
          
              Map<String, Word> countMap = new HashMap<String, Word>();
          
              BufferedReader reader = new BufferedReader(new InputStreamReader(new    FileInputStream(input)));
              String line;
              while ((line = reader.readLine()) != null) {
                  String[] words = line.split("[^A-ZÅÄÖa-zåäö]+");
                  for (String word : words) {
                      if ("".equals(word)) {
                          continue;
                      }
          
                      Word wordObj = countMap.get(word);
                      if (wordObj == null) {
                          wordObj = new Word();
                          wordObj.word = word;
                          wordObj.count = 0;
                          countMap.put(word, wordObj);
                      }
          
                      wordObj.count++;
                  }
              }
          
              reader.close();
          
              SortedSet<Word> sortedWords = new TreeSet<Word>(countMap.values());
              int i = 0;
              for (Word word : sortedWords) {
                  if (i > 10) {
                      break;
                  }
          
                  System.out.println("Word \t "+ word.word+"\t Count \t"+word.count);
          
                  i++;
              }
          
              time = System.currentTimeMillis() - time;
          
              System.out.println("Completed in " + time + " ms"); 
              }
          
          
          public static void main(String[] args)throws Exception
          {
             findWordcounts(new File("./don.txt"));               
          }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-25
            • 2011-02-07
            • 2012-08-09
            • 2021-11-17
            • 1970-01-01
            • 1970-01-01
            • 2014-01-24
            相关资源
            最近更新 更多