计算给定字符串中字符的出现次数

时间:2012-03-05 09:47:10

标签: java string count character

我冻结了以下代码,用于计算字符串中字符的出现次数:

public static void main(String[] args) {
    String source = "hello low how ale you";
    Scanner in = new Scanner(System.in);
    String temp = in.nextLine();
    char test = temp.toCharArray()[0];

    int fromIndex = 0;
    int occurences =0;

        while(fromIndex>-1)
        {
        fromIndex = source.indexOf(test, fromIndex);
        System.out.println("found at"+fromIndex);
        //if(fromIndex!=-1) occurences++;
        }
    System.out.println(occurences);
    }

如果“if(fromIndex!= - 1)”行被注释掉,循环无限运行! 如果取消注释相同的行,则循环正确终止。 观察循环的终止取决于变量fromIndex,而不是在If块内更新的变量occurences的更新,这很奇怪。

有关为何发生这种情况的任何猜测?

3 个答案:

答案 0 :(得分:0)

我认为你正在尝试做类似下面的事情。

public class Solution {
    public static void main(String[] args) {
        String source = "hello low how ale you";
        char test = 'u';
        int fromIndex = 0;
        int occurrences = 0;
        int length = source.length();
        while (fromIndex < length) {
            int index = source.indexOf(test, fromIndex);
            if (index != -1) {
                occurrences++;
                fromIndex = index;
            }
            fromIndex++;
        }
        System.out.println(occurrences);
    }
}


一些解释 -

  1. 假设您需要在给定字符串中找到'h',您将从0开始,因此fromIndex初始化将为0。
  2. 从初始位置搜索到字符串结尾。这就是为什么在while循环中,您需要将条件设为fromIndex < length
  3. 现在,尝试查找测试的发生。如果有一个测试角色,你会得到它的角色。否则你得到-1。将其存储在index
  4. 现在,如果index不是-1,请将其分配给fromIndex。因为您现在将从此位置开始搜索。不是从0开始。
  5. 增加fromIndex。无论index变量的值如何,都将执行此操作。

    现在分析您的代码是否有错误。

答案 1 :(得分:0)

如果您不严格使用代码中的方法,我建议您使用正则表达式。你也会有更清洁,更少的代码。试试下面的代码段,假设您有字符ch

char ch = 'o';
String input = "Hi there boys! Come on!";
String regex = ch + "";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);

ArrayList<String> matches = new ArrayList<String>();
while (m.find())
    matches.add(m.group());

System.out.println(matches.size());

答案 2 :(得分:0)

fromIndex值在后续迭代中不会改变。这就是无限循环背后的原因。因为fromIndex会给出字符的确切索引。对于下一个循环,将fromIndex增加1,这将解决问题。

while(fromIndex>-1)         
            {         
                fromIndex = source.indexOf(test, fromIndex+1);         
                System.out.println("found at"+fromIndex);         
                if(fromIndex!=-1) occurences++;         
                }          
            }       

希望这有帮助。