【问题标题】:Sort List<Map<String, Object>> by a particular key in the map [duplicate]按地图中的特定键对 List<Map<String, Object>> 进行排序 [重复]
【发布时间】:2018-04-04 07:10:46
【问题描述】:

我有一个列表,其内容是带有字符串键和值的 Map,如果类型为 String 或 Long。

[{
  "name": "Abc",
  "id": 1522047548000
},
{
  "name": "Xyz",
  "id": 1522048221000
}]

如何对列表进行排序

  1. 基于较长的 id
  2. 基于字符串的名称

【问题讨论】:

  • 重新表述你的问题,我不明白。 {name,id} 是值吗?关键是什么?
  • @anat0lius 键始终是字符串类型,但值是字符串类型的名称和长类型的 id。我想根据id排序

标签: java json list arraylist hashmap


【解决方案1】:

从 JAVA 1.8 开始,java.util.Comparator 中有一个新方法,称为比较。 它返回比较器按给定键比较对象。 https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function-

在这种情况下,按名称进行比较如下所示:

 list.sort(Comparator.comparing(o -> String.valueOf(o.get("name"))));

并通过 id 进行比较:

 list.sort(Comparator.comparing(o -> (Long) o.get("id")));

【讨论】:

  • 我猜用第二个比较器排序会破坏第一个比较器的排序。不是吗?
  • @StefanSteinegger 是的,我的问题是如何分别处理每个案例。 Id 的字段不应该相等。
  • 确实,这个问题不清楚。
【解决方案2】:

使用 Java 8,你可以做这样的事情:

list.stream()
.sorted((a, b) -> a.get("id").compareTo(b.get("id"))
   .thenComparing(a.get("name").compareTo(b.get("name")));

结果是另一个流,您可以将其收集到另一个列表中。这不会更改原始列表(可能有用也可能没用)。

(我是 Java 新手,过去几年习惯使用 C#,所以我可能遗漏了一些东西......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多