2012-02-15 8 views
1

Я новичок в Java, и в настоящее время я переписываю Perl-код в Java. В Perl я есть хэша Hash какJava HashMap из HashMap vs HashMap of String

$hashref->{index1}->{index2}->{index3} = $value; 

В этом я хранить INDEX1, index2 и index3 в 3 отдельных хешей наряду с выше хэш. Также Index1 и index2 имеют тип long, а index3 - String.

Теперь я хочу переписать подобный материал на Java. Так я придумал 2 способами

1)HashMap<Long, HashMap<Long ,HashMap<String,String> >> 
2)HashMap<String, String> //In this approach i concatenate index1,index2 and index3 using _ and make a single string 

Я хочу знать, какой способ будет эффективным, как максимум 100 ключей для INDEX1, 300 ключей для index2 и 700 ключей для index3 возможно.

+1

Возможный дубликат [Java-эквивалент хэша Perl] (http://stackoverflow.com/questions/4769111/java-equivalent-of-perls-hash) – DVK

+0

Обратите внимание, что ваш первый код, отрезанный, определенно НЕ компилируется Perl-код :) – DVK

+0

см. Ссылку DVK ... вы получите то, что хотите ... –

ответ

3

Во-первых, давайте обсудим # 2

  • Это не работает в 100% от времени из-за возможной неоднозначности, если строки индекса может содержать символ-разделитель («_»):

    Например рассмотрим 3 набора индексов: («12», «13_13» и «14») и («12_13», «13» и «14»). Оба они производят один и тот же конкатенированный ключ.

  • Это не позволяет простой обработке хешей уровня 2-го и 3-го уровня в качестве структур данных легко.

    E.g. вы не можете легко сделать Java-эквивалент «keys %{$hash->{index1}}» - найти все ключи для хэша второго уровня, хранящегося под индексом1. Это выполнимо, но намного сложнее. Или "delete $hash->{index1}".

Если эти 2 соображения вас не беспокоят, использование конкатенированного ключа для 1-уровневого HashMap в порядке.

Если это так, вам нужно сделать # 1 - ранее была проведена довольно надежная реализация на SO ранее: "Java equivalent of Perl's hash". Обратите внимание, что такая реализация НЕ является тривиальной, поэтому ваш альтернативный подход конкатенированного 1 уровня индексов является очень хорошей альтернативой.

+0

Я подозреваю, что вариант 2 также может иметь проблемы, если две карты с одинаковыми элементами имеют другой порядок итераций. –

+0

@LouisWasserman - если он хочет эквивалент хэша Perl, я не думаю, что он заботится об итерационном порядке вообще. Хорошая точка, хотя – DVK

+0

Я бы не сказал * много * сложнее, вам нужно будет перебирать все ключи и соответствовать заданному шаблону; достаточно легко, если вы используете разные символы между клавишами. Тем не менее, я все же использую вложенные хеши. –