ハッシュテーブルは、効率的なデータの格納と検索を実現するために広く使用されるデータ構造です。この記事では、Javaでハッシュテーブルを実装し、特定の値を検索する方法を紹介します。
問題の概要
以下のようなコードで、配列を使ってハッシュテーブルを実装しようとしたとき、うまく動作しないことがあります。
public static void main(String[] args) throws Exception {
int[] nums = {1, 3, 5, 6, 7, 10, 20};
int[] hashNums = new int[nums.length];
for(int i=0; i<hashNums.length; i++){
int hashNum = nums[i] % 7;
hashNums[hashNum] = nums[i];
System.out.println(hashNums[hashNum] + " ");
}
// 検索したい値
int val = 5;
int valHash = val % 7;
System.out.println("検索値:" + valHash + " 添え字:" + valHash);
}
このコードでは、同じハッシュ値に対して複数の値が格納される可能性があるため、正しくハッシュ検索ができません。
解決方法:リストを使用した衝突解決
ハッシュテーブルの衝突を避けるためには、各ハッシュ値に複数の値を格納できるようにする必要があります。ここでは、ArrayList
を使用して実装する方法を紹介します。
ArrayListを使用したハッシュテーブルの実装
以下のコードは、ArrayList
を使ってハッシュテーブルを実装し、値を格納する例です。
import java.util.ArrayList;
public static void main(String[] args) throws Exception {
int[] nums = {1, 3, 5, 6, 7, 10, 20};
ArrayList<Integer>[] hashTable = new ArrayList[7]; // 7はハッシュテーブルのサイズ
// 初期化
for (int i = 0; i < hashTable.length; i++) {
hashTable[i] = new ArrayList<>();
}
// ハッシュテーブルへの格納
for (int i = 0; i < nums.length; i++) {
int hashNum = nums[i] % 7;
hashTable[hashNum].add(nums[i]);
}
// ハッシュテーブルの内容を表示
for (int i = 0; i < hashTable.length; i++) {
System.out.println("Index " + i + ": " + hashTable[i]);
}
// 検索したい値
int val = 5;
int valHash = val % 7;
if (hashTable[valHash].contains(val)) {
System.out.println("検索値: " + val + " はハッシュテーブルのインデックス " + valHash + " に存在します。");
} else {
System.out.println("検索値: " + val + " はハッシュテーブルに存在しません。");
}
}
コードのポイント
- 初期化:
ArrayList
の配列を作成し、各インデックスに空のリストを初期化します。 - 値の格納: 配列
nums
の各値に対してハッシュ値を計算し、そのハッシュ値に対応するArrayList
に値を追加します。 - 検索: 検索したい値に対してハッシュ値を計算し、対応する
ArrayList
にその値が存在するかどうかを確認します。
結果
この方法を用いることで、ハッシュ値が衝突した場合でも、値を正しく格納および検索できるようになります。
結論
ArrayList
を使用することで、ハッシュテーブル内で同じインデックスに複数の値を持つことができ、衝突を効果的に処理できます。Javaでハッシュテーブルを実装する際には、データの格納方法と検索方法を考慮することが重要です。