【问题标题】:Counting Letters计数字母
【发布时间】:2015-04-09 17:48:21
【问题描述】:

我在完成这段代码时遇到了一些困难。基本上,我必须计算一个字母出现在给定字符串中的次数。例如,ABA 应该输出以下内容

"A appears 1 times"
"B Appears 1 times"
"A Appears 1 times"

但是我编写的以下代码执行以下操作(它是方法的一部分)

public static char[] counter(char[] original, char[] manipulated) {
    int counter =0;
        for (int i=0; i<manipulated.length; i++) {
            for (int j=0; j<original.length; j++) {
                if (original[j] == manipulated[i]) {
                    counter++;
                } else {
                    
                }
            }
            System.out.println(manipulated[i] + " appears " + counter + " times");
            counter = 0;
        }
    
    return manipulated;
}

输出是这样的:

"A appears 2 times"
"B appears 1 times"
"A appears 2 times"

这没有错,但这不是我想要的。所以请您尽快协助我解决这个问题。我知道我想重置一些变量,但我不确定在哪里实际重置它。

*一些注意事项: 操纵的变量只是不包含重复项的字符串,所以 原始将是 abaa,操纵将是 aba :)

【问题讨论】:

  • “这没有错,但这不是我想要的”——你想要它怎么样?
  • 你描述它的方式是你想要的方式,它只是一个迭代字符数组并打印它出现的问题(因为它暗示每次你看到它都会出现一次)。否则,最好通过为您看到的每个 unique 字符增加一个计数器来计算字符数,这样您就不会多次打印重复字符的计数。
  • @alfasin 我想要这样。如果输入为“AABA”,则应显示“A 出现 2 次,B 出现 1 次,A 出现 1 次”。我的代码的方式是打印出“A 出现 3 次,B 出现 1 次,A 出现 3 次”

标签: java string count duplicates


【解决方案1】:

如果您的预期行为只是“打印出每个字符连续出现的次数”,那么我不确定您为什么需要 manipulated 变量。您当前的代码只是接受它作为参数,然后原封不动地返回它。

所以除非我误解了这个问题,否则它可能是一个更简单的问题:

void showConsecutiveCharacterCounts(char[] input) {
    int consecutiveCount = 0;
    /* iterate through all chars */
    for (int i = 0; i < input.length; i++) {
        /* increment count - will be 1 first time */
        consecutiveCount++;
        /* if we are at the end of a sequence of chars
           I.e. end of input OR next char does not match */
        if (i == input.length - 1 || input[i] != input[i + 1]) {
            /* print previous sequence */
            System.out.println(input[i] + " appears " + consecutiveCount + " times");
            /* and reset count */
            consecutiveCount = 0;
        }
    }
}

【讨论】:

  • 好的,你的代码可以工作了。但是除非我完全理解它,否则我不想使用它。您能否详细解释一下您的逻辑在这段代码中的位置?我真的很感激。谢谢你。 (评论代码会很有帮助)
  • OK 会添加一些 cmets 来解释它
  • @Tahalilmorsilin 你了解 Alexander 的代码,但你不了解这 6 行简单直观的方法吗?
  • 我没有在哪里说过我理解亚历山大的代码。我只是说他的代码也有效(我在 Eclipse 中测试了他的代码)。但我更喜欢这个,因为它看起来确实简单得多。
  • @Tahalilmorsilin 抱歉,我误解了您的评论。感谢您接受这个。
【解决方案2】:

如果您想知道同一字符连续出现多少次,您可以将代码更改为

  public static void main(String[] args) {
    System.out.println(counter("AAACCAAAAAAAB"));
  }

  public static String counter(String s) {
    int counter = 0;
    int j;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); ) {
      j = i;
      char c = s.charAt(i);
      for (; j < s.length(); j++) {
        if (counter == 0) {
          sb.append(c);
        }
        if (c == s.charAt(j)) {
          counter++;
        } else {
          break;
        }
      }
      System.out.println(s.charAt(i) + " appears " + counter + " times");
      counter = 0;
      i = j;
    }
    return sb.toString();
  }

UPDATE 更改了代码,因此您不需要提供两个 char[] - 现在您输入任何字符串,例如“AAACCAAAAAAAB”(又名“original”)和以前称为的 char[] 'manipulated' 将由方法返回。

结果: A appears 3 times C appears 2 times A appears 7 times B appears 1 times ACAB

【讨论】:

  • 这真的不行,因为当我输入AAAABCCAADEEEE时,整个程序进入了一个循环。 @亚历山大
  • 当我用counter(new char[] {'A','A','A','A','B','C','C','A','A','D','E','E','E','E'}, new char[] {'A','A','A','A','B','C','C','A','A','D','E','E','E','E'}); 调用此代码时,我得到A appears 4 times B appears 1 times C appears 2 times A appears 2 times D appears 1 times E appears 4 times。这不是你想要的吗?你试过我的代码了吗?
  • 出于某种原因,它对我不起作用。我认为这是因为它是您的语法方式。你能用基本的java语言再写一遍吗?例如,我不明白你的 for 循环是如何设置的。谢谢
  • 可能它对你不起作用,因为操纵和原始是不同的 char[]。我正在做的是:内部循环 (j) 仅迭代从 i 的当前位置开始的所有字符,并且仅在两个字符相同时才增加计数(仅计算后续字符)。一旦找到不同的字符,就会退出内部循环 - 这就是为什么 aab 算作两个 a,但 aba 算作一个 a(两次)。
  • 是的。 Manipulated 只是不包含重复项的 Original 版本。因此,如果原始是“AABA”,则被操纵的将是“ABA”。现在有什么办法吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2020-11-11
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多