Hoe krijg je waarde uit LinkedHashMap op basis van index en niet op sleutel?

Ik heb

LinkedHashMap<String, List<String>> hMap;

Ik wil List<String>op positieniet op de sleutel krijgen.

Ik wil iterate niet gebruiken.

Is er een andere manier om waarde te krijgen op basis van index?


Antwoord 1, autoriteit 100%

Je kunt de waarde van de Mapniet op basis van index krijgen, Maps werken gewoon niet op die manier. Een tijdelijke oplossing zou zijn om een ​​nieuwe lijst van uw waarden te maken en de waarde op basis van index te krijgen.

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

Antwoord 2, autoriteit 36%

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

Antwoord 3, autoriteit 25%

Misschien wilt u overwegen een andere klasse te gebruiken om uw gegevens op te slaan, of een extensie schrijven naar de linkedHashMap. zoiets als

//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));
    }
}

Antwoord 4, autoriteit 15%

Zoals Kevin Bowersox al zei, het is zo simpel als

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

Maar het moet worden opgemerkt dat dit nog steeds zal worden herhaald door .toArray() te gebruiken. Het is een eenvoudige verklaring en ik weet niet zeker of er een is met betere prestaties, maar houd er rekening mee dat complexiteit niet log(n) is (zoals geïndexeerde toegang in het geval van B*), maar alleen n.
Aangezien LinkedHashMap is gebaseerd op LinkedList, is er geen manier om willekeurig toegang te krijgen tot elementen, alleen in sequentiële volgorde.

Het casten naar List is een onvermijdelijk kwaad, aangezien .toArray() het archaïsche concept volgt van het retourneren van Object in plaats van een generiek gegevenstype.

Hoewel dit misschien niet het belangrijkste concept van een kaart is, is LinkedHashMap niet zomaar een kaart. het breidt HashMap uit, en als uitbreidingsklasse is het prima om extra methoden te gebruiken die de eigenaardigheden van die klasse ondersteunen.


Antwoord 5, autoriteit 7%

Er is geen directe DS in de standaard Java Collections API om een ​​geïndexeerde kaart te bieden. Het volgende zou u echter het resultaat moeten laten bereiken:

// 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();

Misschien wilt u de zorgen over de persistentie van gegevens in de kaart behouden, los van het ophalen.

Bijwerken:
Of gebruik LinkedMapvan Apache Commons.

Other episodes