В качестве одной из историй для моей текущей итерации на этой неделе мне пришлось реализовать свою первую Ката на языке Java: римские цифры. Как вы, возможно, уже знаете, я только что перешел с Ruby на Java, поэтому каждая простая реализация на данный момент довольно сложна. Хотя логика программы проста, мне было довольно сложно перевести ее в код, связанный с новым - и, если можно так сказать, более сложным - языком (по крайней мере, по сравнению с Ruby!)

Мне пришлось исследовать и попытаться понять, как большинство методов / синтаксиса, которые я хотел реализовать, работают на Java (например, синтаксис циклов for и while, или методы для вставки / доступа к ключам и значениям в хэш), или как создать конструктор классов (спасибо Дейзи за то, что помогла мне с этим!) Также, как протестировать программу (это был первый раз, когда я использовал IntelliJ и его инструменты для тестирования и т. д.). Но что я нашел интересным, так это то, список классов коллекций, которые используют пары ключ-значение, которые может предложить Java.

В своих римских цифрах я хотел создать хеш, в котором можно было бы хранить уникальные римские числа в качестве значений и их эквивалентные арабские числа в качестве ключей, как я делал раньше, когда реализовывал ту же Ката в Ruby. Я поискал в Интернете и первым нашел документацию на HashTable. Я - и человек, который тогда был со мной в паре - думал, что это будет соответствовать моим целям, поэтому я решил использовать его и реализовал свою коллекцию в моей функции convert. Теперь у меня была коллекция римских чисел, которую легко получить по их ключам с помощью Java-метода .get(). Моя программа должна была принять арабское число до 500 в качестве аргумента типа integer, перебрать каждый из упорядоченных ключей в HashTable, пока не будет найдено первое наименьшее арабское число, извлечь и добавить его эквивалентное римское число в пустую строку ранее сохраненный в переменной, вычтите его из числа, переданного в качестве аргумента, и повторите процесс с самого начала, пока он не станет нулевым после каждой итерации, и в конечном итоге верните римское число в виде строки.

К сожалению, некоторые из моих тестов после того, как все это реализовали, не дали результатов. Поскольку я не мог понять, почему, также вызванный одним из комментариев Crafters ', я решил распечатать массив со всеми ключами моего хэша и обнаружил, что они не соблюдают порядок, который я помещал элементы внутри хеша с. Поэтому я провел дальнейшие исследования и обнаружил, что HashTable - не единственный способ реализовать хэш в Java. Это также:

  • HashMap
  • TreeMap
  • LinkedHashMap

Вышеупомянутые объекты реализуют почти одинаковые общедоступные интерфейсы (интерфейс HashMap и LinkedHashMapimplementMap и разрешают null в качестве значения и в качестве ключа, TreeMap реализует интерфейс NavigableMap и допускает только null в качестве значения) и предлагают в основном те же функции. Они могут отображать ключи в значения. Они не могут содержать повторяющиеся ключи; каждый ключ может соответствовать не более чем одному значению.

Наиболее важным отличием является порядок, в котором будет происходить итерация записей:

  • HashMap не дает никаких гарантий относительно порядка карты; в частности, это не гарантирует, что порядок будет оставаться постоянным с течением времени.
  • TreeMap сортируется в соответствии с естественным порядком его ключей в соответствии с их compareTo() методом (или внешним Comparator). Кроме того, он реализует SortedMapinterface. ASorted Map - это Map, который дополнительно обеспечивает полное упорядочение своих ключей.
  • Как и обычный HashMap,butLinkedHashMap, отличается от него тем, что он может запоминать порядок, в котором были вставлены элементы, или его можно настроить так, чтобы он запомнил порядок, в котором к элементам был осуществлен последний доступ.
  • Бонус: похоже, Hashtable - это общее название для карт на основе хешей, и это устаревший класс до того, как существовала структура коллекций, поэтому его больше не следует даже использовать.

Я решил сменить свой HashTable на LinkedHashMap , и когда я провел тесты, все они прошли!