---
title: "Hashtabell"
type: "forum-thread"
url: "https://www.webforum.nu/amne/java/28269-hashtabell"
topic: "Java"
topic_url: "https://www.webforum.nu/amne/java"
author: "Navegador"
published: "2001-05-13T20:48:00.000Z"
updated: "2001-05-15T00:19:00.000Z"
replies: 5
views: 561
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/java/28269-hashtabell"
---

# Hashtabell

## #1 — Navegador, 2001-05-13T20:48Z

Uppgift:

Implementera en klass Dictionary som stödjer operationerna insert och lookup. Följer några av raderna i Dictionary
\-klassen. Ta för givet att du har en hashtabell-klass.

public class Dictionary {

	// några av metoderna
	void insert(Hashable key, Object definition);
	Object lookup(Hashable key,) throws ItemNotFound;
	
}

Så här ser det ut i ett fungerande pgm:

public final class TestHashTable {
    public static void main( String \[ \] args ) {
        HashTable h = new QuadraticProbingTable( );

        h.insert( new MyString( new String( "Becky" ) ) );
        
    }
 
... 
    
}

Jag vill istället:

public final class TestDictionary {

    public static void main( String \[ \] args ) {
    
		Dictionary d = new Dictionary();
		
		// Nyckeln är "cykel"
		// String är object för "tvåhjuligt fordon"
        d.insert( new MyString( new String( "cykel" ) ), new String("Tvåhjuligt fordon") );
        
    }
    
}

I Dictionary:

public class Dictionary {
	
	private Object definition;
	
	// Konstruktor
	public Dictionary () {
	
		// Hash tabell konstrueras	
    	HashTable h = new QuadraticProbingTable( );
    
    }
    
    void insert (Hashable key, Object definition) {
	
		this.definition = definition;	
		h.insert( key );
		        
	}
	
}

Resultat:
/../TestDictionary.java:16: Class Hashable not found in void main(java.lang.String\[\]).
        d.insert( new MyString( new String( "cykel" ) ), new String("Tvåhjuligt fordon") );
                ^
/../Dictionary.java:18: Class Hashable not found in type declaration.
    void insert (Hashable key, Object definition) {
         ^
/../Dictionary.java:23: Undefined variable or class name: h
		h.insert( key );
		^
...

7 errors
Done

Undefined variable or class name: h
\- varför då? Jag har ju skapat Hashtabellen i konstruktorn.

Allting importeras på liknande sätt som i det fungerande pgm:et.

Permalänk: https://www.webforum.nu/p/28269

## #2 — sgtpepper, 2001-05-13T21:48Z

Class **Hashable** not found 

Du har missat ett t...

Permalänk: https://www.webforum.nu/p/401857

## #3 — Navegador, 2001-05-13T22:00Z

Nej. Key måste vara Hashable.

/\*\*
 \* Protocol for Hashable objects.
 \* @author Mark Allen Weiss
 \*/
public interface Hashable
{
    /\*\*
     \* Compute a hash function for this object.
     \* @param tableSize the hash table size.
     \* @return (deterministically) a number between
     \*     0 and tableSize-1, distributed equitably.
     \*/
    int hash( int tableSize );
}

Vad är Hashtabeller bra för? Jo, man får ungefär linjär åtkomsttid oavsett storlek.

Permalänk: https://www.webforum.nu/p/401858

## #4 — spango, 2001-05-14T08:41Z

\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>public Dictionary () {
// Hash tabell konstrueras
HashTable h = new QuadraticProbingTable( );
}

Du måste lägga deklarationen av h utanför konstruktorn, annars är den lokal i den.
\<font size="1" face="Verdana, Arial, Helvetica, sans-serif"\>Kod:\<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600"\>
private HashTable h;
public Dictionary () {
h = new QuadraticProbingTable( );
}

Permalänk: https://www.webforum.nu/p/401859

## #5 — Navegador, 2001-05-14T21:01Z

I main:

try {
	result = (String) d.lookup( new MyString( "fel" ) );
    System.out.println( "Found " + result );
}
catch ( ItemNotFound e ) { 
	System.out.println( "Cykel not found" );
}

I annan klass: Dictionary

Object lookup (Hashable key) throws ItemNotFound {
	
	try {
    	h.find (key);
    	return this.definition;
    }
    catch( ItemNotFound e ) { 
    	return null;
    }

}

Resultat: "Found null" Inte riktigt vad jag tänkt mig. Vad är god programmeringsstil i
sådana här fall? Hur skickas felet vidare från catch i Dictionary uppåt i hierarkin?

\[Redigerat av Navegador den 15 maj 2001\]

Permalänk: https://www.webforum.nu/p/401860

## #6 — sgtpepper, 2001-05-15T00:19Z

Varför deklarerar du att du slänger undantaget ItemNotFound när du i själva verket fångar det i metoden?

Om du inte fångar undantaget så kastas ju det till den anropande metoden där du kan ta hand om det, vilket du redan gör. Alltså: fimpa try-catch i lookup() så skall det funka.

Permalänk: https://www.webforum.nu/p/401861

---

Tråden på webben: https://www.webforum.nu/amne/java/28269-hashtabell
