Подтвердить что ты не робот

Как получить значение из LinkedHashMap на основе индекса не по ключу?

У меня

LinkedHashMap<String, List<String>> hMap;

Я хочу получить List<String> по позиции не на клавише.

Я не хочу использовать итерацию.

Есть ли другой способ получить значение на основе индекса?

4b9b3361

Ответ 1

Вы не можете получить значение Map на основе индекса, Map просто не работают таким образом. Обходным путем было бы создать новый список из ваших значений и получить значение на основе индекса.

LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);

Ответ 2

public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
   return (List<String>) hMap.values().toArray()[index];
}

Ответ 3

вам может потребоваться использовать другой класс для хранения ваших данных или написать расширение связанногоHashMap. что-то вроде

//this is pseudo code
public class IndexedLinkedHashMap<K,V> extends LinkedHashMap{

HashMap<int,K> index;
int curr = 0;

    @Override
    public void add(K key,V val){
        super.add(key,val);
        index.add(curr++, key);
    }

    public V getindexed(int i){
        return super.get(index.get(i));
    }

}

Ответ 4

Как сказал Кевин Бауэрсокс, это так же просто, как

List<String> result = (List<String>) hMap.values().toArray()[position];

Но следует отметить, что это все равно будет повторяться с использованием .toArray(). Это простой оператор, и я не уверен, есть ли у него более высокая производительность, но имейте в виду, что сложность не является log (n) (например, индексированный доступ в случае B *), а просто n. Поскольку LinkedHashMap основан на LinkedList, нет способа случайного доступа к элементам, только в последовательном порядке.

Приведение в список является неизбежным злом, поскольку .toArray() следует за архаичной концепцией возвращаемого объекта вместо общего типа данных.

Хотя это может и не быть основной концепцией карты, LinkedHashMap - это не просто карта. он расширяет HashMap и в качестве расширяющегося класса отлично справляется с дополнительными методами, поддерживающими идиосинкразии этого класса.

Ответ 5

В стандартном API коллекций Java нет прямого DS, чтобы обеспечить индексированную карту. Однако следующее должно позволить вам достичь результата:

// An ordered map
Map<K, V> map = new LinkedHashMap<K, V>();
// To create indexed list, copy the references into an ArrayList (backed by an array)
List<Entry<K, V>> indexedList = new ArrayList<Map.Entry<K, V>>(map.entrySet());
// Get the i'th term
<Map.Entry<K,V>> entry = indexedList.get(index);
K key = entry.getKey();
V value = entry.getValue();

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

Обновление: Или используйте LinkedMap из Apache Commons.