2016-04-08 18 views
2

Ich habe einen Code wie diesen, ich versuche, den Wert aus der Liste der Map mit dem in sortby angegebenen Schlüssel zu sortieren. Der Code ist unten:Konvertieren von Map <> zu Map <String, String>

final String sortby = "first"; 
    List<Map> lm = new ArrayList<Map>(); 
    Map m = new HashMap(); 
    m.put("id", "eka"); 
    m.put("first", "ek"); 
    m.put("last", "a"); 
    lm.add(m); 
    m = new HashMap(); 
    m.put("id", "adit"); 
    m.put("first", "adi"); 
    m.put("last", "t"); 
    lm.add(m); 

    for(Object M : lm){ 
     System.out.println(M.toString()); 
    } 

    Comparator<Map<String,String>> mapComparator = new Comparator<Map<String,String>>() { 
     public int compare(Map<String,String> m1, Map<String,String> m2) { 
      return m1.get(sortby).compareTo(m2.get(sortby)); 
     } 
    }; 

    Collections.sort(lm, mapComparator); 

    for(Object M : lm){ 
     System.out.println(M.toString()); 
    } 

aber es kann nicht Vergleicher vergleichen, weil inkompatible Datentypen. Wie kann ich Map<> in Map<String,String> oder einen anderen Vorschlag umwandeln, damit der Vergleicher alle Datentypen vergleichen kann?

+6

warum machst du nicht einfach die anfängliche 'Liste ' eine 'Liste >'? – SomeJavaGuy

+0

, da die Eingabe für die Zuordnung nicht immer Zeichenfolge ist –

+0

Dies geschieht bei der Verwendung von Rohtypen. – bcsb1001

Antwort

1
class MapComparator<K,V extends Comparable<V>> implements Comparator<Map<K,V>> { 

    public int compare(Map<K,V> m1, Map<K,V> m2) { 
    return m1.get(sortby).compareTo(m2.get(sortby)); 
    } 

} 
+0

Danke @HannoBinder –

1

Sie verwenden Rohtypen für die Variablen lm und m. Sie können den Code wie folgt ändern:

List<Map<String, String>> lm = new ArrayList<>(); 
Map<String, String> m = new HashMap<>(); 
// ... 

m = new HashMap<>(); 
// ... 

for (Map<String, String> map : lm) 
{ 
    // ... 
} 

// ... 

for (Map<String, String> map : lm) 
{ 
    // ... 
} 

Beachten Sie, dass die ArrayList Konstruktor <> statt <Map> verwendet, was darauf hinweist, dass der Typ von der linken Seite der Zuweisung (Map<String, String>) abgeleitet wird. Man könnte es auch so schreiben:

List<Map<String, String>> lm = new ArrayList<Map<String, String>>() 

Das gleiche gilt für die HashMap Bauer.

+0

OP sagte, dass seine Eingabe nicht immer ein String ist, daher kann er 'Map ' nicht für die Quellkarte verwenden. – Tom

+0

Wie unterscheidet es sich von @KevinEsche Antwort im Kommentar? –

Verwandte Themen