如何使用嵌套循环计算字符串中重复的字符总数?

时间:2018-12-09 10:27:19

标签: java string

我需要编写一个程序,计算一个字符串中重复字符的总数。例如,如果字符串是“ gigi the gato”,则输出为7。(“ g”重复3次,“ i”重复2次,“ t”重复2次。)我需要使用嵌套循环。

这就是我所拥有的。这个想法是正确的,但我的输出5是错误的。

public class CountD {
    public static void main(String[] args) {
        String s1 = "gigi the gato";
        s1 = s1.replace(" ", "");
        int count = 0;
        for (int i = 0; i < s1.length(); i++) {
            for (int j = i + 1; j < s1.length(); j++) {
                if (s1.charAt(i) == s1.charAt(j)) {
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

问题是该代码计算每个字符重复的次数(如果重复的话),但是它不包括字符本身。其次,如果char重复两次以上,则每次出现后,此char都会额外计数一次。抱歉,如果令人困惑。无论如何,您可以自己跟踪代码。请问您能解决它并解释如何做吗?

5 个答案:

答案 0 :(得分:1)

使用外部for循环遍历同一字符串,将计算已经一次又一次计数的同一字符。
将外部for循环替换为while循环,并在每次进行char检查之后,从字符串中删除char:

public static void main(String[] args) {
    String s1 = "gigi the gato";
    s1 = s1.replace(" ", "");
    int count = 0;
    while (!s1.isEmpty()) {
        boolean found = false;
        for (int j = 1; j < s1.length(); j++) {
            if (s1.charAt(0) == s1.charAt(j)) {
                found = true;
                count++;
            }
        }
        if (found)
            count++;
        s1 = s1.replace(s1.substring(0, 1), "");
    }
    System.out.println(count);
}

答案 1 :(得分:0)

在存在匹配项时设置标志。一旦内循环完成,就根据标志增加计数。这样可以确保在计数中包含原始字符。

答案 2 :(得分:0)

真的需要嵌套循环吗?您可以尝试以下方法:

public static void main(String[] args) {
  String s1 = "gigi the gato";
  s1 = s1.replaceAll(" ", "");
  int count = 0;
  while (s1.length() > 0) {
    int lengthBefore = s1.length();
    String firstChar = s1.substring(0, 1);
    s1 = s1.replace(firstChar, "");
    int diff = lengthBefore - s1.length();
    if (diff > 1) count += diff;
  }
  System.out.println(count);
}

答案 3 :(得分:0)

public static int countDuplicatedChars(String str) {
    int count = 0;
    char[] arr = str.toLowerCase().toCharArray();

    for (int i = 0; i < arr.length; i++) {
        char ch = arr[i];

        if (ch == ' ' || ch == '\0')
            continue;

        int total = 0;

        for (int j = i; j < arr.length; j++) {
            if (ch != arr[j])
                continue;
            total++;
            arr[j] = '\0';
        }

        if (total > 1)
            count += total;
    }

    return count;
}

您可以对Stream做同样的事情:

public static int countDuplicatedChars(String str) {
    return str.chars()
              .filter(ch -> ch != ' ')
              .mapToObj(i -> (char)i)
              .collect(Collectors.groupingBy(Function.identity(), Collectors.collectingAndThen(Collectors.counting(), Long::intValue)))
              .entrySet().stream()
              .mapToInt(Map.Entry::getValue)
              .filter(count -> count > 1)
              .sum();
}

答案 4 :(得分:0)

如果允许您使用流式传输:

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

public static long countD(String s) {
    Map<Integer, Long> map = s.chars()
            .filter(c -> c != ' ').boxed()
            .collect(groupingBy(c -> c, counting()));

    return map.values().stream()
            .filter(count -> count > 1)
            .mapToLong(c -> c)
            .sum();
}


  public static void main(String[] args) {
        System.err.println(countD("gigi the gato")); // 7
        System.err.println(countD("gigi tge gato")); // 8
  }