对Map 的List进行排序

我有一个像这样创建的列表variables:

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

在我的Android应用程序中,此列表已填充。

举个例子:

 Map map1 = new HashMap(); map.put("name", "Josh"); ... Map map2 = new HashMap(); map.put("name", "Anna"); ... Map map3 = new HashMap(); map.put("name", "Bernie"); ... list.add(map1); list.add(map2); list.add(map3); 

我使用list通过扩展BaseAdapter并实现各种方法在ListView显示结果。

我的问题:我需要根据地图的键按字母顺序对list进行排序

问题:根据地图的键 ,按字母顺序对list进行排序的简单方法是什么?

我似乎无法绕过这个。 我已将每个Map中的每个名称提取到一个String数组中,并对其进行排序( Arrays.sort(strArray); )。 但这并没有保留每个Map的其他数据,所以我不太确定如何保留其他映射值

Solutions Collecting From Web of "对Map 的List进行排序"

以下代码完美无缺

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

但是你的地图可能应该是特定类的实例。

你应该实现一个Comparator

>

,它基本上从它传递的两个地图中提取“name”值,然后比较它们。

然后使用Collections.sort(list, comparator)

你确定Map真的是你列表中最好的元素types吗? 也许你应该有另一个包含 Map但又有getName()方法的类?

 @Test public void testSortedMaps() { Map map1 = new HashMap(); map1.put("name", "Josh"); Map map2 = new HashMap(); map2.put("name", "Anna"); Map map3 = new HashMap(); map3.put("name", "Bernie"); List> mapList = new ArrayList>(); mapList.add(map1); mapList.add(map2); mapList.add(map3); Collections.sort(mapList, new Comparator>() { public int compare(final Map o1, final Map 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")); } 

您需要创建一个比较器。 我不确定为什么每个值都需要自己的映射,但这里是比较器的样子:

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

你可以看到它与上面的例子一起使用:

 public class MapSort { public List> testMap() { List> list = new ArrayList>(); Map myMap1 = new HashMap(); myMap1.put("name", "Josh"); Map myMap2 = new HashMap(); myMap2.put("name", "Anna"); Map myMap3 = new HashMap(); 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> testMap = ms.testMap(); System.out.println("Before Sort: " + testMap); Collections.sort(testMap, new ListMapComparator()); System.out.println("After Sort: " + testMap); } } 

你会有一些types安全警告,因为我不担心这些。 希望有所帮助。

如果你想使用lamdas并使它更容易阅读

  List> results; Comparator> sortByName = Comparator.comparing(x -> x.get("Name")); public void doSomething(){ results.sort(sortByName) } 

有点偏离主题
这是一个用于观看共享偏好的小工具
基于较高的答案
可能对某些人有帮助

 @SuppressWarnings("unused") public void printAll() { Map prefAll = PreferenceManager .getDefaultSharedPreferences(context).getAll(); if (prefAll == null) { return; } List> list = new ArrayList<>(); list.addAll(prefAll.entrySet()); Collections.sort(list, new Comparator>() { public int compare(final Map.Entry entry1, final Map.Entry entry2) { return entry1.getKey().compareTo(entry2.getKey()); } }); Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Timber.i("Printing all sharedPreferences"); for(Map.Entry entry : list) { Timber.i("%s: %s", entry.getKey(), entry.getValue()); } Timber.i("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); } 
 try { java.util.Collections.sort(data, new Comparator>() { SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy"); public int compare(final Map map1, final Map 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) { }