wake-up-neo.net

Java bestellte Karte

Gibt es in Java ein Objekt, das wie eine Map zum Speichern und Zugreifen auf Schlüssel/Wert-Paare fungiert, aber eine geordnete Liste von Schlüsseln und eine geordnete Liste von Werten zurückgeben kann, sodass die Schlüssel- und Wertelisten in derselben Reihenfolge liegen?

Als Erklärung für Code suche ich nach etwas, das sich wie meine fiktive OrderedMap verhält:

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}
261
Whatsit

Die Schnittstelle SortedMap (mit der Implementierung TreeMap ) sollte Ihr Freund sein.

Die Schnittstelle hat die Methoden:

  • keySet() , die einen Satz der Schlüssel in aufsteigender Reihenfolge zurückgibt
  • values() , das eine Auflistung aller Werte in aufsteigender Reihenfolge der entsprechenden Schlüssel zurückgibt

Somit erfüllt diese Schnittstelle genau Ihre Anforderungen. Die Schlüssel müssen jedoch eine sinnvolle Reihenfolge haben. Ansonsten können Sie die LinkedHashMap verwenden, wobei die Reihenfolge durch die Einfügereihenfolge bestimmt wird.

337
dmeister

Gibt es ein Objekt, das wie eine Map zum Speichern von und Zugreifen auf Schlüssel-/Wertepaare fungiert, jedoch eine geordnete Liste von Schlüsseln und eine geordnete Liste von Werten zurückgeben kann, sodass die Schlüssel- und Wertelisten in derselben Reihenfolge sind?

Sie suchen nach Java.util.LinkedHashMap . Sie erhalten eine Liste von Map.Entry <K, V> Paaren, die immer in der gleichen Reihenfolge durchlaufen werden. Diese Reihenfolge stimmt mit der Reihenfolge überein, in der Sie die Elemente eingeben. Alternativ können Sie auch Java.util.SortedMap verwenden, wobei die Schlüssel ebenfalls erforderlich sind eine natürliche Reihenfolge haben oder durch ein Comparator spezifizieren lassen.

196
John Feminella

LinkedHashMap behält die Reihenfolge der Schlüssel bei.

Java.util.LinkedHashMap scheint ansonsten wie eine normale HashMap zu funktionieren.

14
VoNWooDSoN

Ich denke, die beste Sammlung, die Sie aus dem Framework erhalten, ist die SortedMap

6
bruno conde

Sie können die NavigableMap - Schnittstelle nutzen, auf die zugegriffen und die in aufsteigender oder absteigender Reihenfolge durchlaufen werden kann. Diese Schnittstelle ist soll die SortedMap-Schnittstelle ersetzen . Die navigierbare Karte wird normalerweise nach der natürlichen Reihenfolge ihrer Schlüssel oder nach einem Komparator sortiert, der zum Zeitpunkt der Kartenerstellung bereitgestellt wird.

Es gibt drei nützliche Implementierungen: TreeMap , ImmutableSortedMap und ConcurrentSkipListMap .

TreeMap Beispiel:

TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key + " (ID = "+ users.get(key) + ")");
}

Ausgabe:

Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)
5

Ich denke, die SortedMap-Oberfläche erzwingt, was Sie verlangen, und TreeMap implementiert dies. 

http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/SortedMap.htmlhttp://Java.Sun.com/j2se/1.5. 0/docs/api/Java/util/TreeMap.html

3
CJ F

Seit Java 6 gibt es auch keine blockierungssichere Alternative zu TreeMap . Siehe ConcurrentSkipListMap .

3
Vadzim

Ich habe Simple Hash Map, verknüpfte Liste und Sammlungen verwendet , um eine Map nach Werten zu sortieren.

import Java.util.*;
import Java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

Die Ausgabe ist:

C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5
0