Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- В задании не описаны вариативность входных данных. Поэтому предлагаю 3 вариант реализации алгоритма, в основе
- всех использовалась сортировка подсчетом.
- Во второй проверке допущена ошибка так как в ожидаемом результате отсутствует символ 'c' из входной стройки.
- В дейтсвии алгоритма возможно 2 варианты обработки символом отсутствующих в алфавите: игнорирование неизвесных
- алфавиту символов, либо добавление их в конец результата
- Для написания алгоритма был выбран 2й вариант и ожидаймый результат 'xbbaaaac'
- */
- @Test
- public void sort() {
- assertEquals("aabcde", sort("bacaed", Arrays.asList('a', 'b', 'c', 'd', 'e')));
- assertEquals("xbbaaaac", sort("abacabax", Arrays.asList('x', 'b', 'f')));
- }
- /*
- Вариант алгоритма при условии, что будет производиться сортировка символов только английского алфавита
- (цифр и спец. символов)
- */
- private String sort(String input, Collection<Character> alphabet) {
- byte[] counter = new byte[128];
- for (byte character : input.getBytes()) {
- counter[character]++;
- }
- StringBuilder result = new StringBuilder();
- for (char alphabetCharacter : alphabet.toArray(Character[]::new)) {
- byte repeatTimes = counter[(byte) alphabetCharacter];
- if (repeatTimes == 0) {
- continue;
- }
- result.append(StringUtils.repeat(alphabetCharacter, repeatTimes));
- counter[(byte) alphabetCharacter] = 0;
- }
- for (int i = 0; i < counter.length; i++) {
- if (counter[i] == 0) {
- continue;
- }
- result.append(StringUtils.repeat((char) i, counter[i]));
- }
- return result.toString();
- }
- /*
- Вариант алгоритма при условии, что будет производиться сортировка символов любого алфавита.
- max_symbol_digit_value - максимальное числовое представление символов
- */
- private String sortAnyAlphabet(String input, Collection<Character> alphabet) {
- short[] counter = new short[max_symbol_digit_value];
- for (char character : input.toCharArray()) {
- counter[character]++;
- }
- StringBuilder result = new StringBuilder();
- for (char alphabetCharacter : alphabet.toArray(Character[]::new)) {
- short repeatTimes = counter[(short) alphabetCharacter];
- if (repeatTimes == 0) {
- continue;
- }
- result.append(StringUtils.repeat(alphabetCharacter, repeatTimes));
- counter[(short) alphabetCharacter] = 0;
- }
- for (int i = 0; i < counter.length; i++) {
- if (counter[i] == 0) {
- continue;
- }
- result.append(StringUtils.repeat((char) i, counter[i]));
- }
- return result.toString();
- }
- /*
- Так же альтернативой первой имплементации алгорита может служить имплементация с использованием Map.
- Этот вариант алгоритма имет смысл использовать в случае необходимости сортировки строки с небольшим алфавитом
- символов из разных языков. Добавляются издержки на поддержание более тяжеловесной структуры данных, но при этом
- нет необходимости хранить неиспользуемые ячейки, и на условиях описанных выше этот алгоритм может показать лучшую
- производительность
- */
- private String sortWithMap(String input, Collection<Character> alphabet) {
- LinkedHashMap<Character, Integer> counter = alphabet.stream().collect(LinkedHashMap::new, (map, item) ->
- map.put(item, 0), Map::putAll);
- for (char character : input.toCharArray()) {
- if (!counter.containsKey(character)) {
- counter.put(character, 0);
- }
- counter.replace(character, counter.get(character) + 1);
- }
- return counter.entrySet().stream().map(a -> (StringUtils.repeat(a.getKey(), a.getValue())))
- .collect(Collectors.joining());
- }
Advertisement
Add Comment
Please, Sign In to add comment