Как получить V из узла (K, V) в хеш-таблице обратно в вызывающий метод в другом классе? - PullRequest
1 голос
/ 18 ноября 2011

Я нахожусь в классе структур данных, и у нас есть назначение, которое включает в себя создание хеш-таблицы для латинского словаря и метода getDefinition в классе LatinDictionary (в основном, обертка), который запрашивает строку после вводастрока вроде так ...

import java.util.Iterator;
import data_structures.*;

public class LatinDictionary {
private DictionaryADT<String,String> dictionary;
private int maxSize = DictionaryReader.entries.length;
....
public String getDefinition(String latinWord) {
    return dictionary.getValue(latinWord);
}

Метод getValue выглядит следующим образом:

package data_structures;
import java.util.Iterator;

public class HashTable <K,V> implements DictionaryADT<K,V>{

private int maxSize,currentSize,tableSize;
private UnorderedList<DictionaryNode<K,V>>[] list;
DictionaryADT<String, String> dictionary;
...
public V getValue(K key){
    int code = hashCode((String)key);
    DictionaryNode temp = new DictionaryNode(key,null);
    if(!list[code].contains(temp))return null;
    DictionaryNode temp2 = new DictionaryNode(null, list[code].find(temp));
    return (V) temp2.value;
}

, а метод поиска из класса неупорядоченного списка выглядит следующим образом:

package data_structures;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class UnorderedList<E> implements Iterable<E>{
public E find(E object) {
    Node<E> current=head;
    Node<E> previous = head;
    Node<E> temp=null;
    while(current!=null && ((Comparable<E>)object).compareTo((current.data))!=0){
        previous=current;
        current=current.next;
        temp=current;
        }

    return temp.data;
    }

DictionaryADT - это предоставляемый интерфейс, а спецификация состоит в том, что LatinDictionary будет ссылаться только на объект ADT, а не на саму хеш-таблицу.Кроме того, я не могу импортировать java.util. *.
Независимо от того, что я пытаюсь, я получаю ошибку "не могу привести" или что-то еще, в зависимости от того, что я пытаюсь, но я не вижу, как добраться от V дострока.К сожалению, я не могу найти НИЧЕГО в Интернете, касающегося самодельных хеш-таблиц, не говоря уже о той реализации, которую я должен использовать здесь.Все, что связано с хэш-таблицами, использует встроенную версию, а не написанную самостоятельно, что не очень полезно.У меня есть этот проект примерно через 2 недели, но есть еще 3 реализации после этого!Любая помощь очень ценится.Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2011

Мне нужно увидеть определение класса Map и класса неупорядоченного списка, но предположительно словарь определен следующим образом

public class MyMap<K, V> {
  public V getValue(K key) ...
}

Если это так, в вашем LatinDictionary внутренняя карта (dictionary) должна быть объявлена ​​с общими типами String.

public class LatinDictionary {
  private MyMap<String, String> dictionary ...
}

В этом случае вам не нужно конвертировать в String, верный класс гарантированно будет возвращен.

[Редактировать] В другой заметке, если вы пишете реализацию карты, вам нужно подумать о конфликтах хэшей.

Вы также можете подумать об использовании некоторых стандартных методов Java, они, как правило, избавят вас от проблем.

//This
int code = hashCode((String) key);
//Could become this
int code = key.hashCode();    //Don't need any casts!
0 голосов
/ 18 ноября 2011

Я понял .... вместо

public V getValue(K key){
.....
DictionaryNode temp2 = new DictionaryNode(null, list[code].find(temp));

это должно быть ...

public V getValue(K key){
....
DictionaryNode temp2 = new DictionaryNode(null, list[code].find(temp).value);
return (V) temp2.value;
}
0 голосов
/ 18 ноября 2011

Если вы не можете сделать как @Shakedown, тогда вы можете сделать это:

public class LatinDictionary implements HomeworkHashtable<String, String> {

    public String getValue(String key){
        int code = hashCode(key);
        DictionaryNode temp = new DictionaryNode(key,null);
        if(!list[code].contains(temp))return null;
        DictionaryNode temp2 = new DictionaryNode(null, list[code].find(temp));
        return temp2.value;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...