排序Map <String,String>列表

jam*_*mes 24 java sorting android

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

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);
Run Code Online (Sandbox Code Playgroud)

list用来ListView通过扩展BaseAdapter和实现各种方法来显示结果.

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

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

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

JB *_*zet 39

以下代码完美无缺

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);
Run Code Online (Sandbox Code Playgroud)

但是您的地图可能应该是特定类的实例.

  • 我不知道你在地图中存储了什么,但是如果它只是静态属性(name,firstName,age等),那么你甚至应该用Class替换地图(例如:class Person {private String name; private String firstName等) (2认同)

Jon*_*eet 7

你应该实现一个Comparator<Map<String, String>>基本上从它传递的两个地图中提取"名称"值,然后比较它们.

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

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


Pau*_*zie 6

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

}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

  List<Map<String,String>> results;

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

  public void doSomething(){
    results.sort(sortByName)
  }
Run Code Online (Sandbox Code Playgroud)