2016-03-28 15 views
1

Ich habe eine Liste der Karten. Welches ich den Schlüssel jeder Karte nicht vorhersagen kann. Schlüssel kann eine zweistellige Zahl sein, die sich entsprechend der Anfrage ändert. Die Werte enthalten eindeutige Werte von Anfrage zu Anfrage. Jetzt muss ich diese Liste der Karten nach dem Wert jedes Schlüssels sortieren. Ich habe schon so etwas wie unten versucht,Sortieren Sie eine Liste der Karten nach Wert in Java

List<Map<String,String>> listOfMaps = new ArrayList<>(); 
Map<String,String> map1 = new HashMap<>(); 
Map<String,String> map2 = new HashMap<>(); 
map1.put("key1","value1"); 
map2.put("key2","value1"); 


listOfMaps.add(map1); 
listOfMaps.add(map2); 

sort(listOfMaps); 

Collections.sort(listOfMaps, new Comparator<Map<String, String>>() { 
     public int compare(final Map<String, String> o1, final Map<String, String> o2) { 
      return o1.get("key").compareTo(o2.get("key")); 
     } 
    }); 

Da „Schlüssel“ kann von der Karte unterscheiden sein, abzubilden scheint, ich hätte nicht den obigen Code verwenden. Ich habe auch diese Beispiele versucht.

How to Sort a List of Maps by two Categories?

Sorting list of maps based on a value

Da ich kann den Schlüssel nicht vorhersagen, könnte ich mit dieser Antwort aus dieser post.Can irgendeine Hilfe finden ?.

+1

Sie alle Ihre Karten nur einen Eintrag enthalten? –

+0

Ich verstehe nicht ganz - vielleicht können Sie einen Testfall hinzufügen, der eine Beispieleingabe zeigt und welche Ausgabe Sie erwarten? – RAnders00

+0

Sortieren Sie also die Schlüssel in allen Karten oder die Werte? Und sortieren Sie alle Karten in der Liste? – pczeus

Antwort

1

Das folgende Beispiel sollte funktionieren, unter der Annahme, dass jedes Kartenelement nur ein Eintrag enthält:

List<Map<String, String>> list = new ArrayList<>(); 
//Add entries 
Collections.sort(list, new Comparator<Map<String, String>>() { 
    public int compare(Map<String, String> o1, Map<String, String> o2) { 
     Collection<String> values1 = o1.values(); 
     Collection<String> values2 = o2.values(); 
     if(!values1.isEmpty() && !values2.isEmpty()){ 
      return values1.iterator().next().compareTo(values2.iterator().next()); 
     }else{ 
      return 0; 
     } 
    } 
}); 
+0

Sieht so aus, als ob das auf der richtigen Spur sein könnte, außer dass es nur den ersten Wert überprüft, nicht alle Werte in der Karte. – pczeus

+0

Ja, ich habe angegeben, dass in meiner Antwort, schauen Sie sich 'unter der Annahme' Teil :) –

+0

@ Darshan Vielen Dank, es funktioniert, vielen Dank. Zweite o1 sollte o2 sein :) –

1

Während es gelegentlich erforderlich ist, ein Map mit nur einem Schlüssel und einen Wert zu erzeugen (Collections.singletonMap wird verwendet für dies), es sieht nicht aus wie Map ist für Ihre Situation geeignet. Es macht viel mehr Sinn eine benutzerdefinierte Klasse mit zwei Feldern zu verwenden, etwa so:

// This is immutable. You may prefer to make fields non-final and add setters. 
// You may also want to override equals() and hashCode(). 
final class StringPair { 

    private final String key; 
    private final String value; 

    StringPair(String key, String value) { 
     this.key = key; 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return "[" + key + ", " + value + "]"; 
    } 
} 

Dann können Sie tun:

List<StringPair> list = new ArrayList<>(); 
list.add(new StringPair("K2", "V2")); 
list.add(new StringPair("K1", "V1"));  
Collections.sort(list, new Comparator<StringPair>() 
    @Override 
    public int compare(StringPair o1, StringPair o2) { 
     return o1.value.compareTo(o2.value); 
    }  
}); 
System.out.println(list); // Prints [[K1, V1], [K2, V2]] 
+0

@ Paul, Danke, aber in meinem Fall muss ich Karten verwenden .. :) –

Verwandte Themen