Цикл по связанным объектам

243
24 марта 2018, 16:22

Имеется объект типа Entry со своими полями где хранятся ключ (Long) и значение (String) и ссылка на следующий объект этого же типа. Эти объекты в свою очередь находятся в массиве (Entry[] table), в общем реализация аналогичная HashMap. Верно ли реализован метод получения ключа по значению? Как бы вы его сами реализовали?

public Long getKey(String value) {
    if(value == null){
        return 0L;
    }
    for (Entry table : table) {
        for (Entry e = table; e != null; e = e.next)
            if (value.equals(e.value))
                return e.getKey();
    }
    return null;
}

UPD, вот код класса возможно будет понятнее:

public class MyCustomHashMap implements MyInterface {
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
Entry[] table = new Entry[DEFAULT_INITIAL_CAPACITY];
int size;
int threshold = (int) (DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
float loadFactor = DEFAULT_LOAD_FACTOR;
int hash(Long key) {
    return key.hashCode();
}
int indexFor(int hash, int length) {
    return hash & (length - 1);
}
Entry getEntry(Long key) {
    int hash = (key == null) ? 0 : hash(key);
    for (Entry entry = table[indexFor(hash, table.length)]; entry != null; entry = entry.next) {
        Long k;
        if (entry.hash == hash && ((k = entry.key) == key || (key != null && key.equals(k))))
            return entry;
    }
    return null;
}
void resize(int newCapacity) {
    Entry[] newTable = new Entry[newCapacity];
    transfer(newTable);
    table = newTable;
    threshold = (int) (newCapacity * loadFactor);
}
void transfer(Entry[] newTable) {
    Entry[] src = table;
    int newCapacity = newTable.length;
    for (int j = 0; j < src.length; j++) {
        Entry e = src[j];
        if (e != null) {
            src[j] = null;
            do {
                Entry next = e.next;
                int i = indexFor(e.hash, newCapacity);
                e.next = newTable[i];
                newTable[i] = e;
                e = next;
            } while (e != null);
        }
    }
}
void addEntry(int hash, Long key, String value, int bucketIndex) {
    Entry e = table[bucketIndex];
    table[bucketIndex] = new Entry(hash, key, value, e);
    if (size++ >= threshold) {
        resize(2 * table.length);
    }
}
void createEntry(int hash, Long key, String value, int bucketIndex) {
    Entry e = table[bucketIndex];
    table[bucketIndex] = new Entry(hash, key, value, e);
    size++;
}

}

READ ALSO
Немного вопросов о многопоточности

Немного вопросов о многопоточности

Сам не первый год пишу на java, но лишь в рамках хобби, с многопоточностью приходится не так часто работать

194
Поиск по бд Firebase | Java-android

Поиск по бд Firebase | Java-android

Есть ListView с множественным выбором,в 1 элемент которого входит к примеру - ингридиент для рецептовКак мне реализовать поиск по моей бд в firebase...

137
Ehcache возвращает null

Ehcache возвращает null

element = new Element(StringId, cacheput(element);

154