сортировка списка карт - PullRequest
24 голосов
/ 01 марта 2011

У меня есть переменная списка, созданная следующим образом:

List<Map<String, String>> list = new ArrayList<Map<String, String>>();

В моем приложении для Android этот список заполняется.

просто пример:

Map<String, String> map1 = new HashMap<String, String>();
map.put("name", "Josh");
...

Map<String, String> map2 = new HashMap<String, String>();
map.put("name", "Anna");
...

Map<String, String> map3 = new HashMap<String, String>();
map.put("name", "Bernie");
...

list.add(map1);
list.add(map2);
list.add(map3);

Я использую list для отображения результатов в ListView, расширяя BaseAdapter и реализуя различные методы.

Моя проблема: мне нужно отсортировать list в алфавитном порядке по ключу карты name

Вопрос: Какой простой способ сортировки list в алфавитном порядке по ключу карты name ?

Я не могу обернуться вокруг этого. Я извлек каждое имя из каждого Map в массив String и отсортировал его (Arrays.sort(strArray);). Но это не сохраняет другие данные в каждом Map, поэтому я не слишком уверен, как я могу сохранить другие сопоставленные значения

Ответы [ 7 ]

37 голосов
/ 01 марта 2011

Следующий код отлично работает

public Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() {
    public int compare(Map<String, String> m1, Map<String, String> m2) {
        return m1.get("name").compareTo(m2.get("name"));
    }
}

Collections.sort(list, mapComparator);

Но ваши карты, вероятно, должны быть экземплярами определенного класса.

6 голосов
/ 01 марта 2011
@Test
public void testSortedMaps() {
    Map<String, String> map1 = new HashMap<String, String>();
    map1.put("name", "Josh");

    Map<String, String> map2 = new HashMap<String, String>();
    map2.put("name", "Anna");

    Map<String, String> map3 = new HashMap<String, String>();
    map3.put("name", "Bernie");

    List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();
    mapList.add(map1);
    mapList.add(map2);
    mapList.add(map3);

    Collections.sort(mapList, new Comparator<Map<String, String>>() {
        public int compare(final Map<String, String> o1, final Map<String, String> o2) {
            return o1.get("name").compareTo(o2.get("name"));
        }
    });

    Assert.assertEquals("Anna", mapList.get(0).get("name"));
    Assert.assertEquals("Bernie", mapList.get(1).get("name"));
    Assert.assertEquals("Josh", mapList.get(2).get("name"));

}
6 голосов
/ 01 марта 2011

Вы должны реализовать Comparator<Map<String, String>>, который в основном извлекает значение "name" из двух переданных карт и сравнивает их.

Затем используйте Collections.sort(list, comparator).

Вы уверены?Map<String, String> действительно лучший тип элемента для вашего списка, хотя?Возможно, у вас должен быть другой класс, который содержит a Map<String, String>, но также имеет метод getName()?

4 голосов
/ 01 марта 2011

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

class ListMapComparator implements Comparator {
    public int compare(Object obj1, Object obj2) {
         Map<String, String> test1 = (Map<String, String>) obj1;
         Map<String, String> test2 = (Map<String, String>) obj2;
         return test1.get("name").compareTo(test2.get("name"));
    }
}

Вы можете увидеть, как он работает с приведенным выше примером, с этим:

public class MapSort {
    public List<Map<String, String>> testMap() {
         List<Map<String, String>> list = new ArrayList<Map<String, String>>();
         Map<String, String> myMap1 = new HashMap<String, String>();
         myMap1.put("name", "Josh");
         Map<String, String> myMap2 = new HashMap<String, String>();
         myMap2.put("name", "Anna");

         Map<String, String> myMap3 = new HashMap<String, String>();
         myMap3.put("name", "Bernie");


         list.add(myMap1);
         list.add(myMap2);
         list.add(myMap3);

         return list;
    }

    public static void main(String[] args) {
         MapSort ms = new MapSort();
         List<Map<String, String>> testMap = ms.testMap();
         System.out.println("Before Sort: " + testMap);
         Collections.sort(testMap, new ListMapComparator());
         System.out.println("After Sort: " + testMap);
    }
}

У вас будут какие-то безопасные предупреждения, потому что я не беспокоился об этом.Надеюсь, это поможет.

1 голос
/ 31 октября 2017

, если вы хотите использовать lamdas и сделать его немного легче для чтения

  List<Map<String,String>> results;

  Comparator<Map<String,String>> sortByName = Comparator.comparing(x -> x.get("Name"));

  public void doSomething(){
    results.sort(sortByName)
  }
0 голосов
/ 05 июня 2016

Немного не по теме
это небольшая утилита для просмотра общих настроек
на основе верхних ответов
может быть кому-то это будет полезно

@SuppressWarnings("unused")
public void printAll() {
    Map<String, ?> prefAll = PreferenceManager
        .getDefaultSharedPreferences(context).getAll();
    if (prefAll == null) {
        return;
    }
    List<Map.Entry<String, ?>> list = new ArrayList<>();
    list.addAll(prefAll.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<String, ?>>() {
        public int compare(final Map.Entry<String, ?> entry1, final Map.Entry<String, ?> entry2) {
            return entry1.getKey().compareTo(entry2.getKey());
        }
    });
    Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    Timber.i("Printing all sharedPreferences");
    for(Map.Entry<String, ?> entry : list) {
        Timber.i("%s: %s", entry.getKey(), entry.getValue());
    }
    Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
0 голосов
/ 10 октября 2014
try {
        java.util.Collections.sort(data,
                new Comparator<Map<String, String>>() {
                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "MM/dd/yyyy");

                    public int compare(final Map<String, String> map1,
                            final Map<String, String> map2) {
                        Date date1 = null, date2 = null;
                        try {
                            date1 = sdf.parse(map1.get("Date"));
                            date2 = sdf.parse(map2.get("Date"));
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        if (date1.compareTo(date2) > 0) {
                            return +1;
                        } else if (date1.compareTo(date2) == 0) {
                            return 0;
                        } else {
                            return -1;
                        }
                    }
                });

    } catch (Exception e) {

    }

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