Я совершенно новичок и сейчас пишу код для университета. Я хочу создать открытую хеш-таблицу и написал этот кусок кода:

public class AuDOpenHashTable extends AuDHashTable {

private LinkedList<Contact>[] table;


public AuDOpenHashTable(int capacity) {
    super(capacity);
    this.table = new LinkedList[capacity];
}

@Override
public void insert(Contact c) {
    int position = hash(c.email);
    if (table[position] == null) {
        table[position] = new LinkedList<>();
    }
    table[position].add(c);
}

@Override
public void remove(Contact c) throws NoSuchElementException{
    int position = hash(c.email);

    if(table[position] != null){
        table[position].remove();
    }
    else{
        throw new NoSuchElementException();
    }
}

@Override
public Contact getContact(String email)throws NoSuchElementException{
    int position = hash(email);
    table[position].getContact(email);

    if(table[position] != null){
        return table[position].get(position);
    }
    else{
        throw new NoSuchElementException();
    }
}

}

public abstract class AuDHashTable {

protected int capacity;
public AuDHashTable(int capacity){
    this.capacity = capacity;
}

public abstract void insert(Contact c);

public abstract void remove(Contact c);

public abstract Contact getContact(String email);

protected int hash(String s){
    int hash = 0;

    for(int i = 0; i < s.length(); i++){
        hash += s.charAt(i);
    }

    hash = hash % capacity;
    return hash;
}

public static void main(String[] args) {

    AuDClosedHashTable hashtabelle = new AuDClosedHashTable(3);
    Contact eins = new Contact("hans.peter@web.de");
    Contact zwei = new Contact("selina.meier@gmail.com");
    Contact drei = new Contact("alexander.bauer@gmx.de");

    hashtabelle.insert(eins);
    hashtabelle.insert(zwei);
    hashtabelle.insert(drei);


    System.out.println(hashtabelle.isFull());
    System.out.println(hashtabelle.getIndexOf("hans.peter@web.de"));
    System.out.println(hashtabelle.getIndexOf("selina.meier@gmail.com"));
    System.out.println(hashtabelle.getIndexOf("alexander.bauer@gmx.de"));


    hashtabelle.remove(drei);
    System.out.println(hashtabelle.isFull());
    System.out.println(hashtabelle.getContact("selina.meier@gmail.com"));
    System.out.println(hashtabelle.getContact("hans.peter@web.de"));
    System.out.println(hashtabelle.getContact("alexander.bauer@gmx.de"));

    AuDOpenHashTable hashtabelle = new AuDOpenHashTable(3);
    Contact eins = new Contact("hans.peter@web.de");
    Contact zwei = new Contact("selina.meier@gmail.com");
    Contact drei = new Contact("alexander.bauer@gmx.de");

    hashtabelle.insert(eins);
    hashtabelle.insert(zwei);
    hashtabelle.insert(drei);

    System.out.println(hashtabelle.getContact("selina.meier@gmail.com"));

    hashtabelle.remove(zwei);

    System.out.println(hashtabelle.getContact("selina.meier@gmail.com"));
}

}

Итак, моя проблема в методе "getContact ()". Если я хочу отображать счет на определенной позиции, и это ЕДИНСТВЕННЫЙ счет на этой позиции, тогда все работает нормально. Но если вы хотите отобразить учетную запись, в которой голова отличается от хвоста, поэтому есть две учетные записи, она дает мне только одну учетную запись (в основном не правильную). Для этих примеров код работает очень хорошо, но если я решу выбрать другие имена, иногда он также не работает. Но чтобы не усложнять, я хотел услышать ваши предложения о том, как я могу улучшить метод "getContact". Заранее спасибо.

1
Maxim 3 Янв 2016 в 21:06

2 ответа

Лучший ответ

Хеш-функция сообщит вам, в каком сегменте может находиться элемент, но вам все равно нужно проверить все элементы в этом сегменте на предмет равенства. getContact должен перебирать LinkedList и проверять электронную почту по каждому контакту, а затем возвращать только контакт с совпадающим адресом электронной почты. То же самое для метода remove.

4
fgb 3 Янв 2016 в 18:18

У разных ключей может быть один и тот же хэш-код. Обычно это обнаруживается при вставке, и в этом случае обычно происходит повторное хеширование, некоторый алгоритм для создания другого хэш-кода, который приводит к другому, возможно, свободному коду. Если не бесплатно, он снова перефразируется. Если это будет продолжаться много раз, возможно, таблица была выделена для маленькой и должна использоваться таблица большего размера.

При получении информации вы должны сравнить данные по индексу с искомым ключом. Если не совпадают, повторите хеширование (тот же алгоритм, что и при вставке) и повторите попытку. Пока вы не найдете его или не окажетесь в пустом индексе, и в этом случае ключа там не было.

1
hans lepoeter 3 Янв 2016 в 19:06