在Java中连续统计字符

时间:2013-05-31 04:32:40

标签: java string

我正在尝试编写一个方法,该方法返回char c首次连续出现在s中的次数,即使它是一次出现的字符。偶数空间也会破坏连续计数。所以字符串“我在编程时很糟糕。”如果char c是'a',则应该只返回1。

下面的代码编译但不会打印正确的答案。在解决这个问题时,只需展示我的一般逻辑。

public class WordCount
{
  public int countRun( String s, char c )
  {
    int counter = 0;
    for( int i = 0; i < s.length(); i++)
    /*There should be other conditions here that checks for first
      appearance consecutively. I've tried my fair share, but no
      luck on getting correct results.*/
    {
      if( s.charAt(i) == c )
      {
        counter += 1;
      }
    }
    return counter;
  }

  public static void main( String args[] )
  {
    WordCount x = new WordCount();
    System.out.println( x.countRun( "Add dog", 'd' ) ); //should return 2
    System.out.println( x.countRun( "Add dog", 'D' ) ); //should return 0
    System.out.println( x.countRun( "Hope you're happy", 'p' )); //should return 1
    System.out.println( x.countRun( "CCCCCcccC", 'C' )); //should return 5
  }
}

我只需要几个指针(逻辑方式或代码)。也许有一种我以前从未见过的字符串方法可以使我的程序更简单。我在编程和Java方面的知识非常有限。

编辑:对于任何想知道这是否是某些家庭作业或其他什么的一部分的人来说,这是一个非常古老的期中考试的问题。我弄错了但出于某种原因却从未打扰过当时要求正确的答案。我今天看了看,想看看我是否知道答案。看起来我没有。

4 个答案:

答案 0 :(得分:6)

你可以在一行中完成:

int result = s.replaceFirst(".*?(" + c + "+).*", "$1").length();

此代码使用正则表达式基本上提取s的{​​{1}}的第一个连续出现的部分,然后得到它的长度。

这也适用于 no 次出现,产生零。

请参阅live demo

答案 1 :(得分:3)

添加一个标志,当你找到一个匹配的字符时突破循环,然后找到“其他任何东西”。也许不是最紧凑或优雅,但真实的原始代码。经过测试,按预期产生2,0,1,5。

public int countRun( String s, char c )
  {
    int counter = 0;
    boolean foundOne = false;
    for( int i = 0; i < s.length(); i++)
    {
      if( s.charAt(i) == c )
      {
        counter += 1;
        foundOne = true;
      }
      else {
        if(foundOne) break;
      }
    }
    return counter;
  }

我发现counter>0是与foundOne==true相同的条件;这将允许您将代码简化为:

public int countRun( String s, char c )
  {
    int counter = 0;
    for( int i = 0; i < s.length(); i++)
    {
      if( s.charAt(i) == c )  counter++;
      else if(counter>0) break;
    }
    return counter;
  }

由于变量名foundOne是自我记录的,因此逻辑更难以遵循这种方式。但是在其他帖子中,“小也很漂亮”......

答案 2 :(得分:0)

使用assci数组计数器

 public static int countRun(String s, char c) {
    int[] counts = new int[256];
    int count = 0;
    char currChar;
    for (int i = 0; i < s.length(); i++) {
        currChar = s.charAt(i);
        if (currChar == c) {// match
            counts[c]++;
        } else if (Character.isSpaceChar(currChar)) {
            counts[c] = 0;// reset counter for c
        } else {// no match
            if (counts[c] > 0) {// return accumulated counts if you have
                count = counts[c];
                return count;
            }
        }
    }
    return count;
 }

答案 3 :(得分:0)

kubelet