Сортировка списка карт <String, String>

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

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 и BaseAdapter различные методы.

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

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

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

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

 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); 

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

 @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")); } 

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

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

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

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

 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); } } 

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

Бит вне темы
Это немного полезно для просмотра sharedpreferences
Основанные на верхних ответах
Может быть для кого-то это будет полезно

 @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("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); } 
 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) { } 

Intereting Posts
Проводник для кредитных карт для наушников с браузером Запретить прокрутку RecyclerView в AppBarLayout до того, как AppBarLayout будет свернут Как вызвать onUpdate () в AppWidgetProvider? 2 вопроса о программировании сокетов с Android Тестирование Android-модулей с помощью дооснастки / RxJava / Roboletric и Mockito Можно ли пропускать onMeasure при добавлении представления в ViewGroup? Как скрыть Umano SlidingupPanel при нажатии за панель Сократить библиотеку сервисов Google Play для использования только с Google Analytics Как получить текущее время из Интернета в Android Как интегрировать функцию шлюза платежей в Android Android RecyclerView узнает первый и последний взгляд на ItemDecoration Отправлять многоадресный аудиосигнал в rtsp, используя libstreaming для восходящего потока с устройства Android Я не могу найти Android SDK на своем компьютере Android – запрет TalkBack анонсировать заголовок TextView вслух Утилита DatePickerDialog Holo не удалась на Android 7 Nougat