Q:

How to Sort a List of Maps by two Categories?

I have a List of maps, in which I have two categories "foo" and "bar"!
With my function now, I can Iterate it and sort by foo with this:
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;
}

Is there an elegant way to sort this by two categorys, so I have it first sortet by Foo, and then by Bar:
   Foo   |   Bar   |   ID        
============================
 A       | 1       | 922
 A       | 2       | 726
 B       | 5       | 121
 B       | 98      | 654
 G       | 1       | 823
 G       | 7       | 324

A:

It's rather obvious, actually. If there is no difference in your first criterion, you go on to the second one.
On second inspection, I have no idea why you're casting the result of toString() to a 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;
}

