2012-01-16 4 views
2

В Perl, если я хочу иметь многоуровневый хэш, я бы написал:Многослойный Hash в Java

$hash_ref->{'key1'}->{'key2'}='value'; 

Где 'key1' может быть именем человека, 'key2' может быть «Сберегательный счет» (против «Checking Account») и 'value' может быть ваша сумма.

Есть ли эквивалент этого в Java, то есть значения доступа через хеш-ссылки? Каков синтаксис для этого? Будем очень благодарны за любые примеры или другие ссылки на ресурсы. Благодаря!

ответ

5

Вы можете иметь Map<Map<..>>, где вы будете в состоянии назвать map.get("key1").get("key2")

Но обратите внимание, что Java является статически типизированный объектно-ориентированный язык. Таким образом, вам лучше создавать классы: Person, SavingsAccount и Person имеет поле private SavingsAccount savingsAcount. Тогда вы будете в состоянии сделать во время компиляции сейфа: map.get("John").getSavingsAccount()

+0

Спасибо за ваш ответ. Я думаю, что способ вложенной карты сделать это наиболее похоже на то, к чему я привык в Perl. Он менее эффективен, чем использование объектного подхода? – DarthestVader

+0

Если вы хотите быстро получить, то карта будет самой быстрой, в то время как объектный подход может понадобиться вам, чтобы использовать список, который снова является дорогим, если вам нужно перебирать большие данные. – Abhi

+1

Он менее эффективен и противоречит философии языка. Ваш код будет считаться любительским, если вы это сделаете на Java.Он также будет нечитабельным и трудноподдерживающим, и ваши коллеги захотят вас застрелить :-) Изучите Java-способ делать что-то или продолжать использовать Perl. –

1

Вы можете создать класс, который представляет собой ключ с надлежащей реализацией для equals и hashCode методов:

9

В Java, мы используем объекты. У нас был бы объект Person, имеющий name объект типа String и savingsAccount типа Account. Этот объект Account будет иметь свойство value, тип BigDecimal.

Java - это язык OO. Это не Perl. Вы должны использовать идиомы Java в Java, а не идиомы Perl.

+0

на днях я увидел код некоторых из наших бывших программистов на Perl: 'LinkedHashMap >>>' – Bozho

+0

Спасибо JB Nizet! – DarthestVader

1

Я не уверен, почему вопрос был отклонен, но чтобы ответить на ваш вопрос, на Java вы можете использовать вложенные Карты для достижения того же.

0

Например, вы можете иметь

HashMap<String, HashMap<String, BigDecimal>>. 

Я бы не назвал это ООД, но вы можете.

Возможно, было бы более читаемо, если бы у вас был класс для представления Person, класса для представления PersonalAccounts, который имеет экземпляры учетной записи в качестве атрибутов, по одному для каждого типа учетной записи (я предполагаю, что их будет очень мало, иначе список будет лучше).

Тогда один

HashMap<Person, PersonalAccounts> 

достаточно, если вы хотите использовать HashMap.

На самом деле вам даже не нужна карта, если экземпляр PersonalAccounts является атрибутом Person.

Смежные вопросы