Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вытаскивать элмент HashMap по позиции итератора


Автор: Royan 27.4.2008, 20:35
Допустим у нас есть класс в котором HashMap - это поле. Класс может выглядть так:

Код

public class Foo {

   private HashMap<Integer, String> map = new HashMap<Integer, String>();

   String getByAbsOrder(Integer idx) {
        //  for писать не хочется
   }
}


Суть такая - тот, кто будет вызывать Foo#getAbsolute(Integer) будет это делать по порядковому индексу, т.е. 0, 1, 2, и т.д. а ключи в мапе могут быть совершенно любым значением int хоть 1111111... вопрос как наиболее эффективно реализовать вышеописанный метод, потому что если там итерировать пока не цикл не дошел до значения указанного в параметре idx, то это будет уж очень не эффективно

Автор: LSD 27.4.2008, 22:59
Чо? smile 

Автор: Royan 28.4.2008, 00:21
Цитата(LSD @  27.4.2008,  19:59 Найти цитируемый пост)
Чо?   smile

В такое время все нормальные люди спят smile

Пример №2 (revised)

Код

public class Foo { 
    private Map<Integer, String> dataMap = new HashMap<Integer, String>(); 

    public String getValueAt(int idx) { 
        // я не хочу здесь писать нечто вроде
        int count = 0;
        for(Integer key : dataMap.keySet()) {
            if(count == idx) {
                return dataMap.get(idx);
            }
            ++count;
        }
    } 

    public void addValue(String s) { 
        dataMap.put(getHashCode(s), s); 
    } 
}
 

Пример использования будет таким
Код

Foo f = new Foo(); 
f.addValue("qwerty"); 
f.addValue("12345"); 
// сейчас в мапе два элемента, которые я должен доставать вот так
f.getValueAt(0); // OK 
f.getValueAt(1); // OK 
f.getValueAt(2); // ERROR - out of range


getHashCode возвращает hash code строки в виде int'а

Автор: Platon 28.4.2008, 08:35
Уважаемый, а можно узнать применение такого подхода?

Добавлено через 8 минут и 19 секунд

Цитата

Код

// я не хочу здесь писать нечто вроде
        int count = 0;
        for(Integer key : dataMap.keySet()) {
            if(count == idx) {
                return dataMap.get(idx);
            }
            ++count;
        }


Это конечно интересно, я бы предложил более простой пример
Код

if (idx >= dataMap.size()) throw new ArrayIndexOutOfBoundsException();
return dataMap.get(idx);

Но, сокравенный смысл мне пока не понятен...

Автор: fixxer 28.4.2008, 09:30
А не проще ли использовать две коллекции, List для поиска по индексу, а Map для поиска по хешу?

Автор: Royan 28.4.2008, 10:01
Цитата(fixxer @  28.4.2008,  06:30 Найти цитируемый пост)
А не проще ли использовать две коллекции, List для поиска по индексу, а Map для поиска по хешу?

Идея! Очень похоже на правильное решение!
Цитата(Platon @  28.4.2008,  05:35 Найти цитируемый пост)
код Java1:2:if (idx >= dataMap.size()) throw new ArrayIndexOutOfBoundsException();
return dataMap.get(idx);
Но, сокравенный смысл мне пока не понятен...

И что мы получим если элементы в хэшмапе расположены по хэш коду, а забираем мы их по порядковому индексу?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)