У меня
LinkedHashMap<String, List<String>> hMap;
Я хочу получить List<String>
по позиции не на клавише.
Я не хочу использовать итерацию.
Есть ли другой способ получить значение на основе индекса?
У меня
LinkedHashMap<String, List<String>> hMap;
Я хочу получить List<String>
по позиции не на клавише.
Я не хочу использовать итерацию.
Есть ли другой способ получить значение на основе индекса?
Вы не можете получить значение Map
на основе индекса, Map
просто не работают таким образом. Обходным путем было бы создать новый список из ваших значений и получить значение на основе индекса.
LinkedHashMap<String, List<String>> hMap;
List<List<String>> l = new ArrayList<List<String>>(hMap.values());
l.get(0);
public List<String> getByIndex(LinkedHashMap<String, List<String>> hMap, int index){
return (List<String>) hMap.values().toArray()[index];
}
вам может потребоваться использовать другой класс для хранения ваших данных или написать расширение связанного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));
}
}
Как сказал Кевин Бауэрсокс, это так же просто, как
List<String> result = (List<String>) hMap.values().toArray()[position];
Но следует отметить, что это все равно будет повторяться с использованием .toArray(). Это простой оператор, и я не уверен, есть ли у него более высокая производительность, но имейте в виду, что сложность не является log (n) (например, индексированный доступ в случае B *), а просто n. Поскольку LinkedHashMap основан на LinkedList, нет способа случайного доступа к элементам, только в последовательном порядке.
Приведение в список является неизбежным злом, поскольку .toArray() следует за архаичной концепцией возвращаемого объекта вместо общего типа данных.
Хотя это может и не быть основной концепцией карты, LinkedHashMap - это не просто карта. он расширяет HashMap и в качестве расширяющегося класса отлично справляется с дополнительными методами, поддерживающими идиосинкразии этого класса.
В стандартном 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.