【问题标题】:Java - counting letter occurrence in a string using IndexOfJava - 使用 IndexOf 计算字符串中出现的字母
【发布时间】:2016-08-10 10:21:18
【问题描述】:
public static void countLetters (String s, char x){
    int length = s.length();
    int count  = 0;
    int index = 0;
    int z = 0;
    while (index < length) {
        int y = s.indexOf(x, z);
        z = z+1;

        if(s.charAt(y)==x){
            count = count + 1;
        }
        index = index + 1;
}
    System.out.println(count);

大家好,我是java新手,所以任何小的指导将不胜感激。 我正在尝试编写一种方法来计算给定字符串和字符中的字母出现次数。

当前的方法确实很重要,但还不够。我被要求使用 indexOf 方法来解决这个问题。我遇到的问题是,如果我输入一个“惊人”的文本并要求查找 char 'a',它会首先通过 'a' 并计算更新,但是当涉及到 char 'm' 时,再次计算我不想要的更新它。

我正在使用 Allen Downey 的书籍 think java - 练习 8.3。 它不是任何作业:)。

【问题讨论】:

标签: java


【解决方案1】:

你应该使用这个:

    int length = s.length();
    int count  = 0;
    int z = 0;
    while (z < length) {
        int y = s.indexOf(x, z);
        if(y == -1){
            break;
        }
        z = (y == z) ? z + 1 : y + 1;

        if (s.charAt(y) == x) {
            count = count + 1;
        }
    }
    System.out.print(count);

基本上,当您使用s.indexOf(chr, fromIndex) 时,它会检查指定索引中的字符,直到找到它,这就是为什么当它位于m 时,它仍然会检查直到在字符串中找到a。此外,如果未找到字符串并中断,则应检查-1,因为这将是搜索的结束,因为从索引到字符串末尾都找不到字符串。这可以防止在进行检查时出现 indexOfBoundsException if(s.charAt(y) == x)

表达式z = (y == z) ? z + 1 : y + 1; 更像是一个 if else 语句。 ? 是三元运算符,是以下形式的缩写:

if(y == z){
   z = z + 1;
}else{
  z = y + 1;
}

因为它是一个简单的 if 语句,它使用表达式设置变量的值,所以可以使用三元运算符来节省代码行数。

【讨论】:

  • Sohlowmawn,你能解释一下“z = (y == z) ? z + 1 : y + 1;”不熟悉该代码。提前感谢您的回答和解释。
  • 谢谢,不胜感激。 :)
【解决方案2】:

这边

public static void countLetters(String string, char character) {
        int count = 0;
        int index = 0;
        while(true) {
            index = string.indexOf(character, index) + 1; // +1 is to continue search 
            if (index == 0)                               //from next character after match
                break;
            count++;
        }
        System.out.println(count);
    }

countLetters("amazingaa", 'a'); 调用它会得到4

【讨论】:

    【解决方案3】:

    您一次遍历一个字符:z = z+1,但是当您调用s.indexOf(x, z) 时,会返回第一次出现的x(大于z)。所以你的迭代将如下所示:

    1. z=0, y=0(“ama​​zing”中第一个 a 的索引)
    2. z=1, y=2(“amazing”中第二个 a 的索引)
    3. z=2, y=2(又是“amazing”中第二个 a 的索引)

    因此,您应该使用z = y+1,而不是z = z+1,并在s.indexOf(x, z) 返回-1 时停止迭代。

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 2019-04-05
      • 2013-11-04
      • 2016-01-23
      相关资源
      最近更新 更多