How to find the most frequently occurring character in a string with Java?

78,413

Solution 1

You already got your answer here: https://stackoverflow.com/a/21749133/1661864

It's a most easy way I can imagine.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MaximumOccurringChar {

    static final String TEST_CASE_1 = "Hello! Are you all fine? What are u doing today? Hey Guyz,Listen! I have a plan for today. Help!";


    public static void main(String[] args) {
        MaximumOccurringChar test = new MaximumOccurringChar();
        List<Character> result = test.maximumOccurringChars(TEST_CASE_1, true);
        System.out.println(result);
    }


    public List<Character> maximumOccurringChars(String str) {
        return maximumOccurringChars(str, false);
    }

    // set skipSpaces true if you want to skip spaces
    public List<Character> maximumOccurringChars(String str, Boolean skipSpaces) {
        Map<Character, Integer> map = new HashMap<>();
        List<Character> occurrences = new ArrayList<>();
        int maxOccurring = 0;

        // creates map of all characters
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);

            if (skipSpaces && ch == ' ')      // skips spaces if needed
                continue;

            if (map.containsKey(ch)) {
                map.put(ch, map.get(ch) + 1);
            } else {
                map.put(ch, 1);
            }

            if (map.get(ch) > maxOccurring) {
                maxOccurring = map.get(ch);         // saves max occurring
            }
        }

        // finds all characters with maxOccurring and adds it to occurrences List
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            if (entry.getValue() == maxOccurring) {
                occurrences.add(entry.getKey());
            }
        }

        return occurrences;
    }
}

Solution 2

Why don't you simply use N letter buckets (N=number of letters in alphabet) ? Just go along the string and increment the corresponding letter bucket. Time complexity O(n), space complexity O(N)

Solution 3

This method allows you to find the most frequently occurring character in a string:

  public char maximumOccuringChar(String str) {
    return str.chars()
            .mapToObj(x -> (char) x)                  // box to Character
            .collect(groupingBy(x -> x, counting()))  // collect to Map<Character, Long>
            .entrySet().stream()
            .max(comparingByValue())                  // find entry with largest count
            .get()                                    // or throw if source string is empty
            .getKey();
}
Share:
78,413
IT_Philic
Author by

IT_Philic

I am a newbie in IT sector.

Updated on February 07, 2022

Comments

  • IT_Philic
    IT_Philic over 2 years

    Given a paragraph as input, find the most frequently occurring character. Note that the case of the character does not matter. If more than one character has the same maximum occurring frequency, return all of them I was trying this question but I ended up with nothing. Following is the code that I tried but it has many errors I am unable to correct:

    public class MaximumOccuringChar {
    
        static String testcase1 = "Hello! Are you all fine? What are u doing today? Hey Guyz,Listen! I have a plan for today.";
    
        public static void main(String[] args) 
        {
            MaximumOccuringChar test = new MaximumOccuringChar();
            char[] result = test.maximumOccuringChar(testcase1);
            System.out.println(result);
        }
    
        public char[] maximumOccuringChar(String str) 
        {
            int temp = 0;
            int count = 0;
            int current = 0;
    
            char[] maxchar = new char[str.length()];
    
            for (int i = 0; i < str.length(); i++) 
            {
                char ch = str.charAt(i);
    
                for (int j = i + 1; j < str.length(); j++) 
                {
                    char ch1 = str.charAt(j);
    
                    if (ch != ch1) 
                    {
                        count++;
                    }
                }
    
                if (count > temp) 
                {
                    temp = count;
                    maxchar[current] = ch;
                    current++;
                }
            }
            return maxchar;
        }
    }