shahul ha
shahul ha

Reputation: 123

Maximum Repeating characters and count

I wanted to get the maximum repeating characters count and its relevant index. I am able to print the max repeating characters in a given string and its index. However I am unable to print the total count of repeating character. Below is my code

public class MaxRepeating {

static char charactercountIndex(String str) {
    int len = str.length();
    int count = 0;

    char res = str.charAt(0);
    for (int i = 0; i < len; i++) {
        int cur_count = 0;
        for (int j = i + 1; j < len; j++) {
            if (str.charAt(i) != str.charAt(j))
                break;
            cur_count++;
        }

        if (cur_count > count) {
            count = cur_count;
            res = str.charAt(i);

        }
    }
    return res;

}

public static void main(String args[]) {

    String str = "aaaaaaccde";
    char s1 = charactercountIndex(str);
    str.indexOf(s1);
    System.out.println(str.indexOf(s1));
    System.out.println(charactercountIndex(str));

    }
  }

output should <0,6> 0 is the index of character a 6 is the total time character "a" present in the string

Upvotes: 0

Views: 553

Answers (4)

Amessihel
Amessihel

Reputation: 6394

You can return the result through a local class instance (which contains both the character and its occurrences). I added a local class CountResult.

By the way, I fixed your code (see // including ... comment).

You can try and check the working code below here.

public class MaxRepeating {

    private static CountResult charactercountIndex(String str) {
        int len = str.length();
        char res = str.charAt(0);
        int count = 0;
        for (int i = 0; i < len; i++) {
            int cur_count = 1; // including the tested char (first occurence)
            for (int j = i + 1; j < len; j++) {
                if (str.charAt(i) != str.charAt(j))
                    break;
                cur_count++;
            }

            if (cur_count > count) {
                res = str.charAt(i);
                count = cur_count;
            }
        }
        return new CountResult(res, count);

    }

    private static class CountResult {
        private char maxChar;
        private int count;

        public CountResult(char maxChar, int count) {
            this.maxChar = maxChar;
            this.count = count;
        }

        public String toString() {
            return String.format("<" + maxChar + "," + count + ">");
        }

    }

    public static void main(String args[]) {

        String str = "aaaaaaccde";
        System.out.println(charactercountIndex(str));

        }
      }

Upvotes: 1

Sergio
Sergio

Reputation: 23

I've done something like this:

static Entry<String, Integer> charactercountIndex(String str) {
    HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
    for (String letter : str.split("")) {
        if (stringIntegerHashMap.containsKey(letter)) {
            stringIntegerHashMap.put(letter, (stringIntegerHashMap.get(letter) + 1));
        } else {
            stringIntegerHashMap.put(letter, 1);
        }
    }

    Entry<String, Integer> maxEntry = null;

    for (Entry<String, Integer> entry : stringIntegerHashMap.entrySet()) {

        if (maxEntry == null
                || entry.getValue().compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }

    return maxEntry;
}

public static void main(String args[]) {

    String str = "aaaabbddddddddddddddddddddaaccde";
    Entry<String, Integer> s1 = charactercountIndex(str);
    System.out.println(s1.getKey());
    System.out.println(s1.getValue());
}

If you have any trouble, let me know.

Upvotes: 1

Oleksandr Riznyk
Oleksandr Riznyk

Reputation: 788

You can create your own class that you will not be bounded to count of returned parameters from method.

public class MyCharacter {
    private static int count;
    private static char character;
    private static int indexOf;

    public void characterCountIndex(String str) {
        int len = str.length();
        for (int i = 0; i < len; i++) {
            int cur_count = 1;
            for (int j = i + 1; j < len; j++) {
                if (str.charAt(i) != str.charAt(j))
                    break;
                cur_count++;
            }

            if (cur_count > count) {
                count = cur_count;
                character = str.charAt(i);
                indexOf = str.indexOf(character);
            }
        }
    }

    @Override
    public String toString() {
        return String.format("<%d, %d>", indexOf, count);
    }

    public static void main(String[] args) {
        String str = "aaaaaaccde";
        MyCharacter myCharacter = new MyCharacter();
        myCharacter.characterCountIndex(str);
        System.out.println(myCharacter);
    }
}

Upvotes: 0

Tim Biegeleisen
Tim Biegeleisen

Reputation: 522007

If you are open to a slightly different approach, there is a fairly straightforward way to do this using regex and streams. We can try splitting the input string into like-lettered substring components using the following regex:

(?<=(.))(?!\\1)

Then, we can use Collections.max to find the largest string in the collection, and finally use String#indexOf to find the index of that substring.

String str = "aaaabbddddddddddddddddddddaaccde";
List<String> parts = Arrays.asList(str.split("(?<=(.))(?!\\1)"));
String max = Collections.max(parts, Comparator.comparing(s -> s.length()));
System.out.println("largest substring: " + max);
int index = str.indexOf(max);
System.out.println("index of largest substring: " + index);

largest substring: dddddddddddddddddddd
index of largest substring: 6

Upvotes: 1

Related Questions