みんなが燃えるJava オープンアドレス法でうまくコンパイルできない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

みんなが燃えるJava オープンアドレス法でうまくコンパイルできない

#1

投稿記事 by dic » 4年前

java房です。
本のとおりに入力しました。
多少 { } [] の数に疑問が残りますが、以下にソースコードを載せます。
どこがまずいところはありますか?

環境は 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 );
    }
}

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: みんなが燃えるJava オープンアドレス法でうまくコンパイルできない

#2

投稿記事 by dic » 4年前

80行名は

コード:

OpenHash< Integer, Data > hash = new OpenHash< Integer, Data >(13);
です。

dic
記事: 657
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: みんなが燃えるJava オープンアドレス法でうまくコンパイルできない

#3

投稿記事 by dic » 4年前

かなりタイプミスしていました。
タイプミスを修正したところ、うまく動きました。
失礼しました。

解決したソースコードを載せて終わりにします。



ファイル名:探索_オープンハッシュ法03.java

コード:

package 探索_オープンハッシュ法03;

import java.util.Scanner;


public class 探索_オープンハッシュ法03
{
    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 m;
    		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) %s  ", 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 );
    }
}
ファイル名:OpenHash.java

コード:

package 探索_オープンハッシュ法03;

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()
        {
        	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(search(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(), table[i].getValue() );
    				break;

    			case EMPTY:
    				System.out.println("-- 未登録 --" );
    				break;

    			case DELETED:
    				System.out.println("-- 削除済み --" );
    				break;
    		}
    	}
    }
}

返信

“C言語何でも質問掲示板” へ戻る