как отсортировать список хэш-карт - PullRequest
3 голосов
/ 03 марта 2010

У меня есть List из HashMap, например, ниже

ArrayList l = new ArrayList ();
HashMap m = new HashMap ();
m.add("site_code","AL");
m.add("site_name","Apple");
l.add(m);
m = new HashMap();
m.add("site_code","JL");
m.add("site_name","Cat");
l.add(m);
m = new HashMap();
m.add("site_code","PL");
m.add("site_name","Banana");
l.add(m)

Я бы хотел отсортировать list на основе site_name. Так что в итоге это будет отсортировано как.

Apple, Banana, Cat

Я пытался что-то вроде этого:

Collections.sort(l, new Comparator(){
           public int compare(HashMap one, HashMap two) {
              //what goes here?
           }
});

Ответы [ 3 ]

11 голосов
/ 03 марта 2010

Если вы сделаете свои коллекции универсальными, они будут выглядеть примерно так:

Collections.sort(l, new Comparator<HashMap<String, String>>(){ 
        public int compare(HashMap<String, String> one, HashMap<String, String> two) { 
            return one.get("site_name").compareTo(two.get("site_name"));
        } 
});

Если вы не можете использовать дженерики, потому что застряли на платформе 1.4 или более ранней версии, вам придется привести get к String.

(Кроме того, я бы предпочел объявить переменные как List и Map, а не ArrayList и HashMap. Но это не имеет отношения к вопросу.)

9 голосов
/ 03 марта 2010

Я думаю, что сейчас самое время подумать о редизайне. Из вашего примера видно, что все ваши объекты имеют одинаковые два поля - site_name и site_code. В таком случае, почему бы не определить свой собственный класс, а не использовать HashMap?

public class Site implements Comparable<Site> {
    private String site_name;
    private String site_code;

    // getters and setters, equals, and hashCode

    public int compareTo(Site other) {
        return this.site_name.compareTo(other.getSiteName);
    }
}

И тогда вы можете просто использовать Collections.sort().

3 голосов
/ 03 марта 2010

Что-то вроде:

String codeOne = (String)one.get("site_code");
String codeTwo = (String)two.get("site_code");

return codeOne.compareTo(codeTwo);

Я не скомпилировал и не протестировал это, но это должно быть так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...