查找字符串中发生的最多字符

时间:2017-01-13 01:40:17

标签: java string

我有这段代码:

public char charCounter(String input){
ArrayList<Character> list = new ArrayList<Character>();
for (Character c : input.toCharArray()) {
list.add(c);

有一种方法可以在输入String中找到最常用的字符而不使用HashMap?

我试图使用:

int max = Collections.max(list.values())

但我不能。

可以帮我一个人吗? 感谢

5 个答案:

答案 0 :(得分:1)

你走了:

AbstractFunction

这不区分大小写。您可以稍微调整它以使其区分大小写。

答案 1 :(得分:1)

如果字符集受ANSI限制,可以使用下一种方法。

  1. 如果符号出现
  2. ,则创建int数组
  3. 使用事实增加每个字符出现的数组值,该字符可以转换为整数
  4. 请参阅以下代码:

    public static char getMaxFrequencyCharacter(String str) {
        int[] occurrences = new int[255];
        for (int i = 0; i < str.length(); i++) {
            occurrences[str.charAt(i)]++;
        }
        int max = 0;
        char symbol = 0;
        for (int i = 0; i < occurrences.length; i++) {
            if (occurrences[i] > max) {
                max = occurrences[i];
                symbol = (char) i;
            }
        }
        return symbol;
    }
    

    另请注意,可能有多个字符具有相同的最大频率。 在这种情况下你应该

    1. 查找最大出现次数
    2. 收集occurrences[i] == max
    3. 所有字符

答案 2 :(得分:0)

这是一个区分大小写的版本

    String word = "hello my name is wombat";
    int size = word.length();
    int max = 0;
    char maxChar = 'a';
    for (char x = 'A'; x <= 'z'; x++) {
        word = word.replace(String.valueOf(x), "");
        int newSize = word.length();
        if (size - newSize > max) {
            maxChar = x;
            max = size - newSize;
        }
        size = newSize;
    }

    System.out.println("maxchar is " + maxChar);

答案 3 :(得分:0)

如果需要ArrayList:在构建ArrayList之后,再次对输入的字符进行循环并使用

Collections.frequency(list, c)

获取每个字符出现次数,如果max较小,则将其置于最大值。

PS。为了使它更“聪明”:-)你可以与你的Set<Character>并行创建一个list,使你的输入中包含不同的字符,然后循环遍历该集合以获得Collections.frequency(list, c)

或者,您可以仅使用removeAll方法从列表中删除经过测试的字符,如果您不再需要list - 最后它将为空。

更新 - 工作代码 - removeAll用法有2个变体 - 一个用于第一个最多字符,第二个用于最后一个,如果有超过2个字符具有相同的出现次数。只要您在方法中创建了list并且只需要返回大多数字符,就没有理由保持list不变。无论如何,它在方法结束时消失了。

注意:(我让它们只是静态因为测试我使用的是main - 你不需要这样做) - 选择一个:

    public static void main(String... args) {

    String input = "This is a simple test string+++++";

    System.out.println("charCounterV1First: first most Character: "
            + charCounterV1First(input));
    System.out.println("charCounterV1Last: last most Character: "
            + charCounterV1Last(input));

}

public static char charCounterV1First(String input) {
    ArrayList<Character> list = new ArrayList<Character>();
    for (Character c : input.toCharArray()) {
        list.add(c);
    }

    int max = 0;
    Character mostChar = null;
    ArrayList<Character> remList = new ArrayList<Character>();
    while (list.size() > 0) {
        Character nextChar = list.get(0);
        int count = Collections.frequency(list, nextChar);
        if (count > max) {
            max = count;
            mostChar = nextChar;
        }
        remList.clear();
        remList.add(nextChar);
        list.removeAll(remList);
    }
    return mostChar;
}

public static char charCounterV1Last(String input) {
    ArrayList<Character> list = new ArrayList<Character>();
    for (Character c : input.toCharArray()) {
        list.add(c);
    }

    int max = 0;
    Character mostChar = null;
    ArrayList<Character> remList = new ArrayList<Character>();
    while (list.size() > 0) {
        Character nextChar = list.get(0);
        int count = Collections.frequency(list, nextChar);
        if (count >= max) {
            max = count;
            mostChar = nextChar;
        }
        remList.clear();
        remList.add(nextChar);
        list.removeAll(remList);
    }
    return mostChar;
}

答案 4 :(得分:0)

另一种方法是对字符数组进行排序,然后对其进行迭代以找到最长的连续重复项:

final char[] charArray = input.toCharArray();
java.util.Arrays.sort(charArray);

int maxCount = -1;
char charWithMaxCount = '\0';
int i = 0;
while (i < charArray.length) {
    int j = i;
    while (j < charArray.length && charArray[j] == charArray[i]) {
        ++j;
    }
    if (j - i > maxCount) {
        maxCount = j - i;
        charWithMaxCount = charArray[i];
    }
    i = j;
}

// now charWithMaxCount is the desired result