Sto scrivendo una tabella hash che usa il sondaggio lineare per risolvere le collisioni.
Ho esaminato il modo in cui il sondaggio lineare funziona e sembra che permetta la cancellazione, non posso semplicemente rimuovere un elemento, dal momento che ciò potrebbe impedire la ricerca di un elemento precedentemente collocato dopo la cancellazione (poiché la ricerca termina con un cella non occupata).
Ho pensato di avvolgere la coppia Key, Value in una classe che rappresenta solo uno stato. 2 dei 3 stati (ad esempio, Deleted e UnOccupied) stanno semplicemente agendo come "marker"; non reggono nulla Il terzo stato tuttavia (occupato) deve contenere la coppia.
L'obiettivo è distinguere tra celle che sono sempre state vuote e celle che hanno dati precedentemente cancellati da esse.
Per illustrare cosa volevo fare, se stavo scrivendo questo in Haskell, l'avrei configurato come:
data CellState k v = Occ k v | Deleted | UnOcc
Quindi dovrei solo eseguire lo schema di corrispondenza con esso per dire quale sia lo stato della cella e estrarre facilmente la coppia se la cella è occupata.
Devo scrivere questo in Java però. Ho iniziato a scrivere un insieme di classi per i 3 stati che ereditano tutti da una classe base CellState, ma poi ci ho pensato e non sono sicuro di come lo userei anche in quanto l'abbinamento di modelli non è supportato in Java .
La mia seconda idea era quella di definire 1 classe che abbia campi chiave e valore, e abbia un campo stato numerato, con "getter" che possono essere usati per verificare quale sia lo stato della cella. Se l'utente tenta di "ottenere" da un CellState che non è occupato, verrà generata un'eccezione (simile al comportamento di Opzionale). L'utente può quindi utilizzare un if-tree o un interruttore per agire sulla cella in base al suo stato interno.
La seconda idea sembra più imprevedibile, ma sembra ancora maldestra. Ciò consente anche la possibilità di uno stato incoerente in cui sono disponibili una chiave e un valore, ma è contrassegnato come non occupato o in cui è contrassegnato come Occupato, ma non contiene una coppia. Questo non è possibile nella "soluzione Haskell".
A proposito, questo è per i compiti a casa, quindi non posso semplicemente non usare il sondaggio lineare, poiché questo è un requisito di assegnazione.
C'è un modo migliore per farlo?