В качестве одной из историй для моей текущей итерации на этой неделе мне пришлось реализовать свою первую Ката на языке Java: римские цифры. Как вы, возможно, уже знаете, я только что перешел с Ruby на Java, поэтому каждая простая реализация на данный момент довольно сложна. Хотя логика программы проста, мне было довольно сложно перевести ее в код, связанный с новым - и, если можно так сказать, более сложным - языком (по крайней мере, по сравнению с Ruby!)
Мне пришлось исследовать и попытаться понять, как большинство методов / синтаксиса, которые я хотел реализовать, работают на Java (например, синтаксис циклов for и while, или методы для вставки / доступа к ключам и значениям в хэш), или как создать конструктор классов (спасибо Дейзи за то, что помогла мне с этим!) Также, как протестировать программу (это был первый раз, когда я использовал IntelliJ и его инструменты для тестирования и т. д.). Но что я нашел интересным, так это то, список классов коллекций, которые используют пары ключ-значение, которые может предложить Java.
В своих римских цифрах я хотел создать хеш, в котором можно было бы хранить уникальные римские числа в качестве значений и их эквивалентные арабские числа в качестве ключей, как я делал раньше, когда реализовывал ту же Ката в Ruby. Я поискал в Интернете и первым нашел документацию на HashTable
. Я - и человек, который тогда был со мной в паре - думал, что это будет соответствовать моим целям, поэтому я решил использовать его и реализовал свою коллекцию в моей функции convert
. Теперь у меня была коллекция римских чисел, которую легко получить по их ключам с помощью Java-метода .get()
. Моя программа должна была принять арабское число до 500 в качестве аргумента типа integer, перебрать каждый из упорядоченных ключей в HashTable
, пока не будет найдено первое наименьшее арабское число, извлечь и добавить его эквивалентное римское число в пустую строку ранее сохраненный в переменной, вычтите его из числа, переданного в качестве аргумента, и повторите процесс с самого начала, пока он не станет нулевым после каждой итерации, и в конечном итоге верните римское число в виде строки.
К сожалению, некоторые из моих тестов после того, как все это реализовали, не дали результатов. Поскольку я не мог понять, почему, также вызванный одним из комментариев Crafters ', я решил распечатать массив со всеми ключами моего хэша и обнаружил, что они не соблюдают порядок, который я помещал элементы внутри хеша с. Поэтому я провел дальнейшие исследования и обнаружил, что HashTable
- не единственный способ реализовать хэш в Java. Это также:
HashMap
TreeMap
LinkedHashMap
Вышеупомянутые объекты реализуют почти одинаковые общедоступные интерфейсы (интерфейс HashMap
и LinkedHashMap
implementMap
и разрешают null
в качестве значения и в качестве ключа, TreeMap
реализует интерфейс NavigableMap
и допускает только null
в качестве значения) и предлагают в основном те же функции. Они могут отображать ключи в значения. Они не могут содержать повторяющиеся ключи; каждый ключ может соответствовать не более чем одному значению.
Наиболее важным отличием является порядок, в котором будет происходить итерация записей:
HashMap
не дает никаких гарантий относительно порядка карты; в частности, это не гарантирует, что порядок будет оставаться постоянным с течением времени.TreeMap
сортируется в соответствии с естественным порядком его ключей в соответствии с ихcompareTo()
методом (или внешнимComparator
). Кроме того, он реализуетSortedMap
interface. ASorted Map
- этоMap
, который дополнительно обеспечивает полное упорядочение своих ключей.- Как и обычный
HashMap,
butLinkedHashMap
, отличается от него тем, что он может запоминать порядок, в котором были вставлены элементы, или его можно настроить так, чтобы он запомнил порядок, в котором к элементам был осуществлен последний доступ. - Бонус: похоже,
Hashtable
- это общее название для карт на основе хешей, и это устаревший класс до того, как существовала структура коллекций, поэтому его больше не следует даже использовать.
Я решил сменить свой HashTable
на LinkedHashMap
, и когда я провел тесты, все они прошли!