public class SimpleArrayBoolean {
boolean a[] = new boolean[1000];
public static void main(String args[]) {
// SimpleArrayBooleanオブジェクトを生成してrun()を実行する
SimpleArrayBoolean s = new SimpleArrayBoolean();
s.run();
}
public void run() {
// 配列をクリア(全部false)
for(int i = 0; i < a.length; i++) {
a[i] = false;
}
a[102] = true; // 102というデータを登録する
a[253] = true; // 253というデータを登録する
print_exist(100); // 100というデータは存在するか?
print_exist(102); // 102というデータは存在するか?
print_exist(253); // 253というデータは存在するか?
print_exist(254); // 254というデータは存在するか?
}
void print_exist(int key) {
if (a[key] == false) {
System.out.println(key + "は存在しません");
} else {
System.out.println(key + "は存在します");
}
}
}
if (a[key] == false) {の部分は、 if (!a[key]) {と書いても良い。あるいは、 if で実行する部分と elseで実行する部分を逆転させて、 if (a[key]) {と書いても良い。
// [[[注意]]] このプログラムにはシノニムを考慮していません
public class SimpleHash1_2 {
final int size = 1000;
int a[] = new int[size];
public static void main(String args[]) {
SimpleHash1_2 s = new SimpleHash1_2();
s.run();
}
public void run() {
// 配列をクリア(全部0)
for(int i = 0; i < a.length; i++) {
a[i] = 0;
}
set(530102); // 530102というデータを登録する
set(345253); // 345253というデータを登録する
print_exist(530100); // 530100というデータは存在するか?
print_exist(530102); // 530102というデータは存在するか?
print_exist(345253); // 345253というデータは存在するか?
print_exist(345254); // 345254というデータは存在するか?
}
int hash(int key) {
return key % size;
}
void set(int value) {
a[hash(value)] = 1;
}
void print_exist(int key) {
int hashcode = hash(key);
if (a[hashcode] == 0) {
System.out.println(key + "は存在しません");
} else {
System.out.println(key + "は存在します");
}
}
}
hashメソッドを以下のように書き変える。
int hash(int key) {
int value = key % size;
System.out.println(key + "->" + value);
return value;
}
削除(欠番)
例えば、runメソッドの最後にprint_exist(111102); と記述する。111102はハッシュ表に登録していないにもかかわらず、 見つかった(存在する)という結果が出る。これは、111102のハッシュ値が 登録されている530102のハッシュ値と等しいためである。
// [[[注意]]] このプログラムはシノニムを考慮していません
public class StringHash1 {
final int size = 1000;
int a[] = new int[size];
public static void main(String args[]) {
StringHash1 s = new StringHash1();
s.run();
}
public void run() {
// 配列をクリア(全部0)
for(int i = 0; i < a.length; i++) {
a[i] = 0;
}
set("ABC"); // "ABC"というデータを登録する
set("XYZ"); // "XYZ"というデータを登録する
print_exist("AAA"); // "AAA"というデータは存在するか?
print_exist("ABC"); // "ABC"というデータは存在するか?
print_exist("XYZ"); // "XYZ"というデータは存在するか?
print_exist("ZZZ"); // "ZZZ"というデータは存在するか?
}
int hash(String key) {
int v = 0;
for (int i = 0; i < key.length(); i++) {
v += key.charAt(i);
}
return v % size;
}
void set(String value) {
a[hash(value)] = 1;
}
void print_exist(String key) {
int hashcode = hash(key);
if (a[hashcode] == 0) {
System.out.println(key + "は存在しません");
} else {
System.out.println(key + "は存在します");
}
}
}
例えば、runメソッドの最後にprint_exist("YYY"); と記述する。"YYY"はハッシュ表に登録していないにもかかわらず、 見つかった(存在する)という結果が出る。これは、"YYY"のハッシュ値が 登録されている"XXX"のハッシュ値と等しいからである。
課題hash-9のプログラムを作成し、 hashメソッド内で戻り値の値を表示するようにすると容易に求まる。 "ABC"は41,"CBA"は75,"BBB"は58,"CAB"は31となる。
hashメソッドを以下のように書き変えればよい。
int hash(String key) {
int v = 0;
int m = 1;
for (int i = 0; i < key.length(); i++) {
v += key.charAt(i)*m;
m *= 128;
}
return v % size;
}