2015-02-12 6 views
0

У меня есть список карт, в которых у меня есть две категории: «foo» и «bar»! С моей функцией теперь я могу Итерацию его и сортировать по обув с этим:Как сортировать список карт по двум категориям?

public List<Map<String, Object>> makeAllSkillsMaps(List<Stuff> li) { 
    List<Map<String, Object>> l = new LinkedList<Map<String, Object>>(); 
    List<Skill> w_l = li; 
    for (Stuff stuff : w_l) { 
     Map<String, Object> r_m = new HashMap<String, Object>(); 
     r_m.put("ID", stuff.getID()); 
     r_m.put("Bar", stuff.getBar()); 
     r_m.put("Foo", stuff.getFoo()); 
     l.add(r_m); 
    } 
    Comparator<Map<String, Object>> mapComparator = new Comparator<Map<String, Object>>() { 
     public int compare(Map<String, Object> m2, Map<String, Object> m1) { 
      return ((String) m1.get("Foo").toString()).compareTo((String) m2.get("Foo").toString()); 
     } 
    }; 
    l.sort(mapComparator); 
    return l; 
} 

Есть элегантный способ сортировки это два categorys, так что я его первый sortet на Foo, а затем Bar:

Foo | Bar | ID   
============================ 
A  | 1  | 922 
A  | 2  | 726 
B  | 5  | 121 
B  | 98  | 654 
G  | 1  | 823 
G  | 7  | 324 
+0

возможно дубликат [Мульти критериев сортировки списка объектов с Гуава Заказ] (http://stackoverflow.com/questions/15532880/multi-criteria-sorting-of-a-list-of-objects -with-guava-ordering) – Joe

+0

Возможно, вы захотите посмотреть [ComparatorChain] (https://commons.apache.org/proper/commons-collections/javadocs/api-2.1.1/org/apache/commons/ сборники/компараторы/ComparatorChain.html) – A4L

+0

@Joe Спасибо, что напомнили мне об этом вопросе. Я также прочитал его, но я не думаю, что эти два являются дубликатами, так как у меня совершенно другой подход. – user3383458

ответ

0

Это довольно очевидно, на самом деле. Если в вашем первом критерии нет разницы, вы переходите ко второму.

При второй проверке я понятия не имею, почему вы делаете результат toString() на String.

public int compare(Map<String, Object> m2, Map<String, Object> m1) { 
    int cmp = m1.get("Foo").toString().compareTo(m2.get("Foo").toString()); 
    if (cmp == 0) { 
     return m1.get("Bar").toString().compareTo(m2.get("Bar").toString()); 
    } 
    return cmp; 
} 
+0

Кастинг остается прежним, потому что я сначала не использовал метод toString(). – user3383458

+0

Гарантируется ли это, что в баре содержится целое число? Потому что, если это так, возможно, вы можете применить к Integer вместо того, чтобы делать сравнение строк, что является хрупким сравнением. – blagae

Смежные вопросы