在java中按字段对Map列表进行分组



我有一个地图列表,如下所示:

Map<String, Object[]> dates = new TreeMap<String, Object[]>();
dates.put("1", new Object[] {"Group ID", "Group Name", "Product", "Mode" });
dates.put("2", new Object[] {1, "foo", "PHONE", 11});
dates.put("3", new Object[] {1, "foo", "Ipad", 12});
dates.put("4", new Object[] {1, "foo", "Air Pod", 13});
dates.put("6", new Object[] {2, "boo", "Lumia", 14});
dates.put("7", new Object[] {2, "boo", "Oppo", 13});
dates.put("8", new Object[] {2, "boo", "Xiaomi", 15});
dates.put("9", new Object[] {3, "loo", "Tesla", 10});
dates.put("10", new Object[] {3, "loo", "Audi", 15});
dates.put("11", new Object[] {3, "loo", "Ford", 19});

如何按组Id和组名称对映射列表进行分组处理后,它应该看起来像:

1 - foo
Product | Mode
Phone   | 11
Ipad    | 12
Air Pod | 13
2 - boo
Product | Mode
Lumia   | 14
Oppo    | 13
Xiaomi  | 15
3 - loo
Product | Mode
Tesla   | 10
Audi    | 15
Ford    | 19

如前所述,您可以灵活地构建数据。

如果为GroupProduct定义了两个新的类/记录,那么这将变得容易得多。例如:

record Product(int id,
String name,
int mode) {
}
record Group(int id,
String name,
List<Product> products) {
}

然后,您可以创建这样的数据(我选择忽略给定示例的标题字符串(:

List<Group> groups = List.of(
new Group(1, "foo", List.of(
new Product(2, "Ipad", 12),
new Product(3, "Air Pod", 13),
new Product(4, "Lumia", 14)
)),
new Group(2, "boo", List.of(
new Product(5, "Oppo", 13),
new Product(6, "Xiaomi", 15),
new Product(7, "Tesla", 10)
)),
new Group(3, "loo", List.of(
new Product(8, "Audi", 15),
new Product(9, "Ford", 19),
new Product(1, "PHONE", 11)
))
);

然后相对直接地循环通过groups,然后打印出每个group的产品:

groups.forEach(group -> {
System.out.println();
System.out.println(group.id() + " - " + group.name());
System.out.println("Product | Mode");
group.products().stream()
.sorted(Comparator.comparing(Product::mode))
.forEach(product -> System.out.println(product.name() + " | " + product.mode()));
});

最新更新