Появление строки в соответствии с порядком - PullRequest
1 голос
/ 27 сентября 2019

У меня проблема, когда мне нужно найти первое вхождение символа в соответствии с порядком, в котором они встречаются в данной строке.

Например:

У меня есть строка "Unitedin" , где символы "n" и "i" встречаются в строке несколько раз. char n произошло в charAt (1,7) char i произошло в charAt (2,6) Но символ "i" появился раньше, чем char "п" .

Я пробовал что-то вроде этого, но я не получаю требуемый вывод. Может кто-нибудь помочь мне, пожалуйста?Примечание: Задача - не использовать любой тип List, Hashset или Hashmap

    public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            StringBuilder nodup = new StringBuilder();
            StringBuilder dup = new StringBuilder();
            System.out.println("Enter a string : ");
            String instring = in.next();
            for (int i = 0; i < instring.length(); i++) {
                for (int j = i + 1; j < instring.length(); j++) {
                    if (instring.charAt(i) == instring.charAt(j)) {
                        nodup.append(instring.charAt(i));

                    } else {
                        dup.append(instring.charAt(i));
                    }
                }

            }
            System.out.print(nodup.toString());

Я получаю OutPut как: ni .но Требуемый вывод в .

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Если ваша цель - просмотреть первое повторение персонажа, то это должно быть сделано.Порядок будет таким, в котором повторяющийся символ найден в вашей строке.

String input = "Unitedin";
Stringbuilder sb = new Stringbuilder();
Map<Character, Integer> map = new HashMap<>();
for (char chr : input.toCharArray()) {
    Integer count = map.get(chr);
    count = count != null ? count + 1 else 1;
    map.put(chr, count);

    if(count > 1) {
        sb.append(chr);
    }
}

System.out.println(sb.toString());  // Output:  in

РЕДАКТИРОВАТЬ: я понимаю из вашего комментария, что вы не можете использовать экземпляр List, HashSet или HashMap?Тогда разрешен ли LinkedHashMap?Если нет, то вам нужно как-то воссоздать эту функциональность.

Вы можете отобразить символы az и AZ в массиве int из 52 (26 + 26).Вместо того, чтобы вставить счетчик в карту, вы сопоставляете символ с соответствующим местом в массиве и обновляете счетчик.Удачи!

0 голосов
/ 27 сентября 2019

Класс LinkedHashMap отлично работает для вашей конкретной задачи.Вы можете перебрать массив символов из вашей входной строки, а затем добавить символы вместе с их количеством в качестве ключей в LinkedHashMap.Поскольку LinkedHashMap сохраняет порядок вставки, для получения нужного результата вам нужно только выполнить итерацию карты и распечатать все ключи, число которых больше единицы.Порядок символьных клавиш будет фиксироваться при первом появлении каждой буквы.

String input = "Unitedin";
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
for (char chr : input.toCharArray()) {
    Integer count = map.get(chr);
    map.put(chr, count == null ? 1 : count + 1);
}
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
    if (entry.getValue() > 1) System.out.println(entry.getKey());
}

Это печатает:

n
i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...