Простая реализация HashTable с использованием массива в Java? - PullRequest
4 голосов
/ 31 марта 2012

У меня проблема с реализацией очень простого HashTable с использованием массива.Проблема в том, что первый элемент, помещенный в HashTable, всегда равен AVAILABLE.Может быть, вы, ребята, видите, что происходит не так.Это HashTable класс:

public class HashTable {

    private Item[] data;
    private int capacity;
    private int size;
    private static final Item AVAILABLE = new Item("Available", null);

    public HashTable(int capacity) {

        this.capacity = capacity; 
        data = new Item[capacity];
        for(int i = 0; i < data.length; i++) {

            data[i] = AVAILABLE;
        }
        size = 0;
    }

    public int size() {

        return size;
    }

    public int hashThis(String key) {

        return key.hashCode() % capacity; 
    }

    public Object get(String key) {

        int hash = hashThis(key);

        while(data[hash] != AVAILABLE && data[hash].key() != key) {

            hash = (hash + 1) % capacity;
        }
        return data[hash].element();
    }

    public void put(String key, Object element) {

        if(key != null) {
            size++;
            int hash = hashThis(key);
            while(data[hash] != AVAILABLE && data[hash].key() != key) {

                hash = (hash + 1) % capacity;
            }

            data[hash] = new Item(key, element);

        }

    }

    public Object remove(String key) {
        // not important now.
        throw new UnsupportedOperationException("Can't remove");
    }

    public String toString() {

        String s = "<HashTable[";
        for(int i = 0; i < this.size(); i++) {

            s += data[i].toString();
            if(i < this.size() - 1) {

                s += ",";
            }
        }
        s += "]>";
        return s;
    }

}

Для большей ясности, это Item класс:

public class Item {

    private String key;
    private Object element;

    public Item(String key, Object element) {

        this.setKey(key);
        this.setElement(element);
    }

    public String key() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public Object element() {
        return element;
    }

    public void setElement(Object element) {
        this.element = element;
    }

    public String toString() {

        String s = "<Item(";
        s += this.key() + "," + this.element() + ")>";
        return s;
    }

}

Чтобы привести пример:

HashTable ht = new HashTable(10);
ht.put("1", "a");

Вывод toString () после установки должен быть:

"<HashTable[<Item(1,a)>]>"

, но я получаю:

"<HashTable[<Item(Available,null)>]>"

update: Я, вероятно, должен упомянуть, чтоследующий предмет помещается правильно, а следующий после него больше не будет.

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Я думаю, что проблема в вашем toString методе.Вы зацикливаетесь на 0 - размер, когда size = 1, поэтому один раз, чтобы вы распечатали только первое значение в вашей проблеме hashTable, если первое значение в вашей хеш-таблице не является реальным значением, это ДОСТУПНО, вам нужно сделать что-то вроде этого

РЕДАКТИРОВАТЬ: Извините, я забыл переместить индекс.

public String toString() {
   String s = "<HashTable[";
   int i = 0;
   int count = 0;
   while(count < this.size()) {

        //Skip the AVAILABLE cells
        if(data[i] == AVAILABLE) {
            i++;
            continue;
        }

        s += data[i].toString();
        if(count < this.size() - 1) {
            s += ",";
        }
        count++;
    }
    s += "]>";
    return s;
}
1 голос
/ 18 апреля 2014

Попробуйте это для toString (), если все еще заинтересованы в решении, я запустил его и все нормально:

public String toString()
{
    String s = "<HashTable[";
    for (int i = 0; i < this.capacity; i++)
    {
        if (data[i].Element != null)
        {
            s += data[i].toString();
            if (i < this.size - 1)
            {
                s += ",";
            }
         }
     }
     s += "]>";
     return s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...