Максимальное количество повторяющихся символов и количество - PullRequest
0 голосов
/ 23 октября 2018

Я хотел получить максимальное количество повторяющихся символов и соответствующий ему индекс.Я могу напечатать максимально повторяющихся символов в данной строке и ее индекс.Однако я не могу напечатать общее количество повторяющихся символов.Ниже приведен мой код

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));

    }
  }

вывод должен <0,6> 0 - индекс символа a 6 - общее время, в течение которого в строке присутствует символ «a»

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Вы можете вернуть результат через локальный экземпляр класса (который содержит как символ, так и его вхождения).Я добавил локальный класс CountResult.

Кстати, я исправил ваш код (см. // including ... комментарий).

Вы можете попробовать и проверить рабочий код ниже здесь.

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));

        }
      }
0 голосов
/ 23 октября 2018

Вы можете создать свой собственный класс, который не будет ограничен для подсчета возвращаемых параметров из метода.

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);
    }
}
0 голосов
/ 23 октября 2018

Я сделал что-то вроде этого:

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());
}

Если у вас возникнут проблемы, дайте мне знать.

0 голосов
/ 23 октября 2018

Если вы открыты к немного другому подходу, есть довольно простой способ сделать это с помощью регулярных выражений и потоков.Мы можем попытаться разбить входную строку на компоненты подстроки с одинаковыми буквами, используя следующее регулярное выражение:

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

Затем мы можем использовать Collections.max, чтобы найти самую большую строку в коллекции, и, наконец, использовать String#indexOfчтобы найти индекс этой подстроки.

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
...