Alexey_Skadorva

1

Dec 20th, 2020
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.11 KB | None | 0 0
  1.     /*
  2.         В задании не описаны вариативность входных данных. По этому предлагаю 3 вариант реализации алгоритма, в основе
  3.         всех использовалась сортировка подсчетом.
  4.        
  5.         Во второй проверке допущена ошибка так как в ожидаемом результате отсутствует символ 'c' из входной стройки.
  6.         В дейтсвии алгоритма возможно 2 варианты обработки символом отсутствующих в алфавите: игнорирование неизвесных
  7.         алфавиту символов, либо добавление их в конец результата
  8.         Для написания алгоритма был выбран 2й вариант и ожидаймый результат 'xbbaaaac'
  9.      */
  10.     @Test
  11.     public void sort() {
  12.         assertEquals("aabcde", sort("bacaed", Arrays.asList('a', 'b', 'c', 'd', 'e')));
  13.         assertEquals("xbbaaaac", sort("abacabax", Arrays.asList('x', 'b', 'f')));
  14.     }
  15.    
  16.     /*
  17.       Вариант алгоритма при условии, что будет производиться сортировка символов только английского алфавита
  18.       (цифр и спец. символов)
  19.      */
  20.     private String sort(String input, Collection<Character> alphabet) {
  21.         byte[] counter = new byte[128];
  22.  
  23.         for (byte character : input.getBytes()) {
  24.             counter[character]++;
  25.         }
  26.  
  27.         StringBuilder result = new StringBuilder();
  28.  
  29.         for (char alphabetCharacter : alphabet.toArray(Character[]::new)) {
  30.             byte repeatTimes = counter[(byte) alphabetCharacter];
  31.  
  32.             if (repeatTimes == 0) {
  33.                 continue;
  34.             }
  35.  
  36.             result.append(StringUtils.repeat(alphabetCharacter, repeatTimes));
  37.             counter[(byte) alphabetCharacter] = 0;
  38.         }
  39.  
  40.         for (int i = 0; i < counter.length; i++) {
  41.             if (counter[i] == 0) {
  42.                 continue;
  43.             }
  44.  
  45.             result.append(StringUtils.repeat((char) i, counter[i]));
  46.         }
  47.  
  48.         return result.toString();
  49.     }
  50.  
  51.     /*
  52.         Вариант алгоритма при условии, что будет производиться сортировка символов любого алфавита.
  53.         max_symbol_digit_value - максимальное числовое представление символов
  54.      */
  55.     private String sortAnyAlphabet(String input, Collection<Character> alphabet) {
  56.         short[] counter = new short[max_symbol_digit_value];
  57.  
  58.         for (char character : input.toCharArray()) {
  59.             counter[character]++;
  60.         }
  61.  
  62.         StringBuilder result = new StringBuilder();
  63.  
  64.         for (char alphabetCharacter : alphabet.toArray(Character[]::new)) {
  65.             short repeatTimes = counter[(short) alphabetCharacter];
  66.  
  67.             if (repeatTimes == 0) {
  68.                 continue;
  69.             }
  70.  
  71.             result.append(StringUtils.repeat(alphabetCharacter, repeatTimes));
  72.             counter[(short) alphabetCharacter] = 0;
  73.         }
  74.  
  75.         for (int i = 0; i < counter.length; i++) {
  76.             if (counter[i] == 0) {
  77.                 continue;
  78.             }
  79.  
  80.             result.append(StringUtils.repeat((char) i, counter[i]));
  81.         }
  82.  
  83.         return result.toString();
  84.     }
  85.  
  86.     /*
  87.         Так же альтернативой первой имплементации алгорита может служить имплементация с использованием Map.
  88.         Этот вариант алгоритма имет смысл использовать в случае необходимости сортировки строки с небольшим алфавитом
  89.         символов из разных языков. Добавляются издержки на поддержание более тяжеловесной структуры данных, но при этом
  90.         нет необходимости хранить неиспользуемые ячейки, и на условиях описанных выше этот алгоритм может показать лучшую    
  91.         производительность
  92.     */
  93.     private String sortWithMap(String input, Collection<Character> alphabet) {
  94.         LinkedHashMap<Character, Integer> counter = alphabet.stream().collect(LinkedHashMap::new, (map, item) ->
  95.                 map.put(item, 0), Map::putAll);
  96.  
  97.         for (char character : input.toCharArray()) {
  98.             if (!counter.containsKey(character)) {
  99.                 counter.put(character, 0);
  100.             }
  101.  
  102.             counter.replace(character, counter.get(character) + 1);
  103.         }
  104.  
  105.         return counter.entrySet().stream().map(a -> (StringUtils.repeat(a.getKey(), a.getValue())))
  106.                 .collect(Collectors.joining());
  107.     }
Advertisement
Add Comment
Please, Sign In to add comment