2015-12-17 2 views
0

У меня есть структура данных типа List<Map<String, String>>, и я ищу, чтобы отсортировать все значения Карты внутри Списка в соответствии с значением. Например - список, когда итерация дает карту, которая состоит из двух пар ключей.Сортировка списка <Map> в Java 7

Map1--> Key1: abc and key2: Sometext2 
Map2 --> Key1: cbd and key2: Sometext2 
Map3 --> Key1: bcd and key2: Sometext2 
. 
. 
. 
. 

и так далее. Ищу сортировать по алфавиту структуру данных по значениям, отображенных в ключом1 поэтому он должен выглядеть следующим образом:

Map1--> Key1: abc and key2:Sometext2. 
Map3 --> Key1: bcd and key2: Sometext2 
Map2 --> Key1: cbd and key2: Sometext2 
. 
. 
. 
. 

Я использую Java 7. Любая помощь высоко ценится.

Благодаря

+4

Старт с 'Comparator' – sidgate

+0

Да, я понимаю, что я должен реализовать компаратор, но не в состоянии разобраться в логике. – user972418

+5

Если все карты имеют две пары ключ/значение, с одинаковыми ключами каждый раз, возможно, вы должны создать для этого класс? –

ответ

0

Основываясь на вашем примере, ваш Map просто пара (String, String).

Так что мы можем сделать:

public class MyCouple { 
    private String first; 
    private String second; 
    // + constructors, getters, setters 
} 

List<MyCouple> couples = // ... 
Collections.sort(couples, new Comparator<MyCouple>(){ 
    @Override 
    public int compare(MyCouple c1, MyCouple c2) { 
     return c1.getSecond().compareTo(c2.getSecond()); // sort by second 
    } 
}); 
0

Вы можете использовать класс-оболочку для карты, а затем получить итератор для вашего списка. Что-то вроде этого:

class MapWrapper implements Comparable<Map> { 
    private Map<String, String> map; 

    public MapWrapper (Map<String, String> map) { 
     this.map = map; 
    } 

    public int compareTo() { 
     do stuff 
    } 
} 
0

У меня было подобное требование, и я разработал сопоставимую карту. Декларация Класс:

public class ComparableMap<K,V> extends TreeMap<K,V> implements Comparable<ComparableMap<K,V>> { 
    @Override 
    public int compareTo(ComparableMap<K,V> o) {...} 
} 

С TreeMap итератора возвращает ключи сортируются, чтобы сравнить 2 карты, вы перебирать клавиши, сравнивая каждую клавишу, пока либо клавиши не не равны, или при одинаковых ключей, значения не равны, возвратившись соответствующий результат зависит от того, что меньше. Когда вы достигаете конца одного набора ключей, если у другого есть ключи, тогда они также не равны, и вы вернете соответствующий результат сравнения.

Наконец, вы можете использовать Collections.sort() для сортировки списка карт, так как метод compareTo будет использоваться для определения порядка сортировки.

Надеюсь, это даст вам несколько идей.

Если вы хотите, чтобы отдельные ключи по всем отсортированным картам, вы, вероятно, создали сгруппированную карту.

+0

При необходимости вы можете реализовать compareTo(), чтобы упорядочить свои карты соответствующим образом. – DBug

0

Попробуйте это

static <T> Map<String, T> makeMap(String k1, T v1, String k2, T v2) { 
    Map<String, T> map = new LinkedHashMap<>(); 
    map.put(k1, v1); 
    map.put(k2, v2); 
    return map; 
} 

public static void main(String[] args) { 
    List<Map<String, Integer>> list = Arrays.asList(
     makeMap("abc", 1, "Sometext2", 1), 
     makeMap("cde", 2, "Sometext2", 2), 
     makeMap("bcd", 3, "Sometext2", 3) 
    ); 
    System.out.println("before: " + list); 
    Collections.sort(list, new Comparator<Map<String, Integer>>() { 

     @Override 
     public int compare(Map<String, Integer> o1, Map<String, Integer> o2) { 
      return o1.keySet().iterator().next() 
       .compareTo(o2.keySet().iterator().next()); 
     } 

    }); 
    System.out.println("after: " + list); 
} 

Результаты:

before: [{abc=1, Sometext2=1}, {cde=2, Sometext2=2}, {bcd=3, Sometext2=3}] 
after: [{abc=1, Sometext2=1}, {bcd=3, Sometext2=3}, {cde=2, Sometext2=2}] 
Смежные вопросы