2016-04-08 4 views
2

У меня есть код вроде этого, я пытаюсь сортировать значение из списка карты по ключевому слову, указанному в sortby. Код ниже:Convert Map <> to 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()); 
    } 

, но он не может сравниться с использованием компаратора, поскольку несовместимые типы данных. Как я могу конвертировать Map<> в Map<String,String> или любое другое предложение, чтобы компаратор мог сравнить все типы данных?

+6

почему вы просто don't сделать начальный '' List в 'List >'? – SomeJavaGuy

+0

, потому что вход для карты не всегда Строка –

+0

Это то, что происходит, когда вы используете необработанные типы. – bcsb1001

ответ

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

Спасибо @HannoBinder –

1

Вы используете необработанные типы для переменных lm и m. Вы можете изменить свой код на следующее:

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) 
{ 
    // ... 
} 

Обратите внимание, что ArrayList конструктор использует <> вместо <Map>, указывая, что тип с левой стороны от присваивания (Map<String, String>) выводится. Вы также можете написать это:

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

То же самое относится и к HashMap конструкторах.

+0

OP сказал, что его вход не всегда является строкой, поэтому он не может использовать 'Map ' для исходной карты. – Tom

+0

как он отличается от ответа @KevinEsche в комментарии? –