Java でハッシュ テーブルを作成するにはどうすればよいですか?
質問
Java でハッシュ テーブル (または連想配列など) を作成する最も簡単な方法は何ですか?私のグーグル検索でいくつかの例が見つかりましたが、これを行う標準的な方法はありますか?
また、キーと値のペアごとにオブジェクトの add メソッドを個別に呼び出さずに、テーブルにキーと値のペアのリストを入力する方法はありますか?
解決
Map map = new HashMap();
Hashtable ht = new Hashtable();
どちらのクラスも java.util パッケージから見つけることができます。2 つの違いについては、以下で説明します。 jGuru FAQ エントリー.
他のヒント
二重中括弧を使用してデータを設定できます。引き続き add または put を呼び出しますが、それほど醜くはありません。
private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{
put("foo", 1);
put("bar", 256);
put("data", 3);
put("moredata", 27);
put("hello", 32);
put("world", 65536);
}};
また、Map と Hashtable は両方とも Java 5 以降では (他のクラスと同様に) 汎用であることも忘れないでください。 コレクションフレームワーク).
Map<String, Integer> numbers = new HashMap<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
Integer one = numbers.get("one");
Assert.assertEquals(1, one);
import java.util.HashMap;
Map map = new HashMap();
何 エドマンド 言った。
常に .add を呼び出すわけではないということに関しては、いいえ、慣用的にではありません。本当にその気になれば実行できるさまざまなハック (配列に格納してループする) もありますが、私はお勧めしません。
また、キーと値のペアごとにオブジェクトの add メソッドを個別に呼び出さずに、テーブルにキーと値のペアのリストを入力する方法はありますか?
あなたの質問の問題の 1 つは、データがそもそもどのような形式であるかについて言及していないことです。ペアのリストがたまたま Map.Entry オブジェクトのリストであった場合、それは非常に簡単です。
これを吐き出すために、Hashtable の拡張である java.util.Properties という名前の (かなり悪意のある) クラスがあります。文字列のキーと値のみを想定しており、ファイルまたはストリームを使用してデータをロードおよび保存できます。読み書きするファイルの形式は次のとおりです。
key1=value1
key2=value2
これがあなたが探しているものであるかどうかはわかりませんが、これが役立つ状況があります。
Java のハッシュ関数は最適とは言えないことに注意することが重要です。衝突を減らし、最大 50% の容量で再ハッシュをほぼ完全に排除したい場合は、Buz Hash アルゴリズムを使用します。 バズ・ハッシュ
Java のハッシュ アルゴリズムが弱い理由は、文字列をハッシュする方法で最も明らかです。
"a".hash()
の ASCII 表現を与える "a"
- 97
, 、 それで "b"
だろう 98
. 。ハッシュ化の要点は、任意の「可能な限りランダムな」数値を割り当てることです。
簡単で汚いハッシュ テーブルが必要な場合は、ぜひ次を使用してください。 java.util
. 。よりスケーラブルで堅牢なものを探している場合は、独自の実装を検討します。
Hashtable<Object, Double> hashTable = new Hashtable<>();
値を入れる ...
最大値を得る
Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());
if (optionalMax.isPresent())
System.out.println(optionalMax.get());