本のとおりに入力しました。
多少 { } [] の数に疑問が残りますが、以下にソースコードを載せます。
どこがまずいところはありますか?
環境は Visual CODE
OS:Windows 10
コマンドラインとエラーです。
<pre>
PS C:\Users\user\Documents\java> cd 'c:\Users\user\Documents\java'; & 'C:\Users\user\.vscode\extensions\vscjava.vscode-java-debug-0.22.0\scripts\launcher.bat' 'C:\Program Files\Java\jdk1.8.0_191\bin\java' '-Dfile.encoding=UTF-8' '-cp' 'C:\Users\user\AppData\Roaming\Code\User\workspaceStorage\6c8de917c86618c9a075425fa77ea2c4\redhat.java\jdt_ws\jdt.ls-java-project\bin' 'T_I[vAhX@'
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Return type for the method is missing
Syntax error on token "}", { expected after this token
Syntax error, insert "}" to complete Block
Syntax error on token "}", delete this token
Syntax error on token "}", delete this token
The method getKey() is undefined for the type OpenHash.Bucket<K,V>
The method getValue() is undefined for the type OpenHash.Bucket<K,V>
The method serch(K) is undefined for the type OpenHash<K,V>
The method set(K, V, OpenHash.Status) is undefined for the type OpenHash.Bucket<K,V>
The method setStat(OpenHash.Status) is undefined for the type OpenHash.Bucket<K,V>
The method getKey() is undefined for the type OpenHash.Bucket<K,V>
tablei cannot be resolved
Syntax error on token "]", delete this token
Syntax error, insert "}" to complete ClassBody
at OpenHash.<init>(OpenHash.java:14)
at 探索_オープンアドレス法.main(探索_オープンアドレス法.java:80)
PS C:\Users\user\Documents\java>
</pre>
ファイル名:OpenHash.java
public class OpenHash<K,V>
{
// パケットの状態
enum Status { OCCUPIED, EMPTY, DELETED }; // データ格納、空、削除済み
// バケット
static class Bucket<K,V>
{
private K key;
private V data;
private Status stat;
}
Bucket() {}
this.stat = Status.EMPTY;
}
void set( K key, V data, Status stat ) {
this.key = key;
this.data = data;
this.stat = stat;
}
void setStat( Status stat ) {
this.stat = stat;
}
K getKey() {
return key;
}
V getValue() {
return data;
}
public int hashCode() {
return key.hashCode();
}
}
private int size;
private Bucket<K,V>[] table;
public OpenHash(int size)
{
try {
table = new Bucket[size];
for( int i = 0; i < size; i++ )
table[i] = new Bucket<K,V>();
this.size = size;
} catch( OutOfMemoryError e) {
this.size = 0;
System.out.println("OutOfMemoryError e");
}
}
public int hashValue(Object key) {
return key.hashCode() % size;
}
public int rehashValue(int hash) {
return (hash + 1 ) % size;
}
public Bucket<K,V> searchNode(K key) {
int hash = hashValue(key);
Bucket<K,V> p = table[hash];
for(int i=0; p.stat != Status.EMPTY && i < size; i++ ) {
if( p.stat == Status.OCCUPIED && p.getKey().equals(key) )
return p;
hash = rehashValue(hash);
p = table[hash];
}
return null;
}
public V search(K key) {
Bucket<K,V> p = searchNode(key);
if( p != null )
return p.getValue();
else
return null;
}
public int add(K key, V data) {
if(serch(key) != null)
return 1;
int hash = hashValue(key);
Bucket<K,V> p = table[hash];
for( int i=0; i < size; i++ ) {
if( p.stat == Status.EMPTY || p.stat == Status.DELETED ) {
p.set( key, data, Status.OCCUPIED );
return 0;
}
hash = rehashValue(hash);
p = table[hash];
}
return 2; // ハッシュ表が満杯
}
public int remove(K key)
{
Bucket<K,V> p = searchNode(key);
if( p == null )
return 1; // このキー値は登録されていない
p.setStat(Status.DELETED);
return 0;
}
public void dump()
{
for( int i = 0; i < size; i++ )
{
System.out.printf( "%02d ", i );
switch(table[i].stat)
{
case OCCUPIED:
System.out.printf("%s (%s)/n",
table[i].getKey(), tablei].getValue() );
break;
case EMPTY:
System.out.println("-- 未登録 --" );
break;
case DELETED:
System.out.println("-- 削除済み --" );
break;
}
}
}
ファイル名:探索_オープンアドレス法.java
import java.util.Scanner;
public class 探索_オープンアドレス法
{
static Scanner stdIn = new Scanner(System.in);
static class Data {
static final int NO = 1;
static final int NAME = 2;
private Integer no;
private String name;
Integer keyCode() {
return no;
}
public String toString() {
return name;
}
void scanData( String guide, int sw) {
System.out.println(guide + "するデータを入力してください。" );
if( (sw & NO) == NO ) {
System.out.print("番号:";
no = stdIn.nextInt();)
}
if( (sw & NAME ) == NAME ) {
System.out.print("氏名:" );
name = stdIn.next();
}
}
}
enum Menu {
ADD( "追加"),
REMOVE( "削除"),
SEARCH( "探索"),
DUMP( "表示"),
TERMINATE( "終了"),
};
private final String message;
static Menu MenuAt(int idx) {
for( Menu m : Menu.values() )
if( m.ordinal() == idx)
return x;
return null;
}
Menu(String string) {
message = string;
}
String getMessage() {
return message;
}
static Menu SelectMenu()
{
int key;
do {
for( Menu m : Menu.values() )
System.out.printf("(%d) %Rs ", m.ordinal(), m.getMessage() );
System.out.print(":");
key = stdIn.nextInt();
} while( key < Menu.ADD.ordinal() || key > Menu.TERMINATE.ordinal() );
return Menu.MenuAt(key);
}
public static void main(String[] args)
{
Menu menu;
Data data;
Data temp = new Data();
OpenHash< Integer, Data > hash = new OpenHash< Integer, Data >(13);
do {
switch( menu = SelectMenu() )
{
case ADD:
data = new Data();
data.scanData("追加", Data.NO | Data.NAME );
int k = hash.add(data.keyCode(),data);
switch(k)
{
case 1: System.out.println("そのキー値は登録済みです。");
break;
case 2: System.out.println("ハッシュ表が満杯です。");
break;
}
break;
case REMOVE:
temp.scanData("削除", Data.NO );
Data t = hash.search(temp.keyCode() );
if( t != null )
System.out.println("そのキーをもつデータは" + t + "です。" );
else
System.out.println("該当するデータはありません。" );
break;
case DUMP:
hash.dump();
break;
}
} while( menu != Menu.TERMINATE );
}
}