我有一个简单的class人:
class Person {
String firstName;
String lastName;
//getter, setter, constructor, toString
}
以及人员的输入列表,如:
List<Person> myList = List.of(
new Person("Helena", "Graves"),
new Person("Jasmine", "Knight"),
new Person("Phoebe", "Reyes"),
new Person("Aysha", "Graham"),
new Person("Madeleine", "Jenkins"),
new Person("Christina", "Johnson"),
new Person("Melissa", "Carpenter"),
new Person("Marie", "Daniel"),
new Person("Robin", "French"),
new Person("Tamara", "Wyatt"),
new Person("Freya", "Montgomery"),
new Person("Lacey", "Todd"),
new Person("Heather", "Parker"),
new Person("Lauren", "Wright"),
new Person("Annie", "Bradley")
);
现在,我需要根据此人姓氏的第一个字符对上述列表进行分组,并再次对这些组进行分组,使所有从A-H开始的姓氏归为一组,下一组以I-N开始,最后以O-Z开始。
我已经可以按姓氏的第一个字符对列表进行分组:
myList.stream()
.collect(Collectors.groupingBy(p -> String.valueOf(p.getLastName().charAt(0))))
.entrySet()
.forEach(System.out::println);
这给了我:
P=[Person{Heather, Parker}]
B=[Person{Annie, Bradley}]
R=[Person{Phoebe, Reyes}]
C=[Person{Melissa, Carpenter}]
T=[Person{Lacey, Todd}]
D=[Person{Marie, Daniel}]
F=[Person{Robin, French}]
W=[Person{Tamara, Wyatt}, Person{Lauren, Wright}]
G=[Person{Helena, Graves}, Person{Aysha, Graham}]
J=[Person{Madeleine, Jenkins}, Person{Christina, Johnson}]
K=[Person{Jasmine, Knight}]
M=[Person{Freya, Montgomery}]
我很难从这里开始,因为我需要进一步汇总以上内容,以获得包含三个条目/键的地图。期望输出:
Map<String, List<Person>> result = ...
A-H = [Person{Helena, Graves}, Person{Aysha, Graham}, Person{Melissa, Carpenter}, Person{Marie, Daniel}, Person{Robin, French}, Person{Annie, Bradley}]
I-N = [Person{Jasmine, Knight}, Person{Madeleine, Jenkins}, Person{Christina, Johnson}, Person{Freya, Montgomery}]
O-Z = [Person{Phoebe, Reyes}, Person{Tamara, Wyatt}, Person{Lacey, Todd}, Person{Heather, Parker}, Person{Lauren, Wright}]
基本上,您只需要使用收集器进行分组。groupBy(Function)和将每个人分配到正确组的函数:
/**
* This method is null-friendly
*/
String group(Person person) {
return Optional.ofNullable(person)
.map(Person::getFirstName)
.filter(name -> name.length() > 0)
.map(name -> name.charAt(0))
.map(ch -> {
if (ch >= 'A' && ch <= 'H') {
return "A-H";
} else if (ch > 'H' && ch <= 'N') {
return "I-N";
} else if (ch > 'N' && ch <= 'Z') {
return "O-Z";
}
return "*"; // In case the name starts with a character out of A-Z range
})
.orElse("none"); // In case there is empty/null firstName
}
Map<String, List<Person>> map = myList
.stream()
.collect(Collectors.groupingBy(this::group));
您应该稍微更改分类器函数以组合一系列字符。
此外,可能需要对entrySet()进行排序(或在收集到地图时使用SortedMap
/TreeMap
):
myList.stream()
.collect(Collectors.groupingBy(
p -> p.getLastName().charAt(0) < 'I' ? "A-H" :
p.getLastName().charAt(0) < 'O' ? "I-N" : "O-Z"
))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEach(System.out::println);
输出:
A-H=[Person {Helena Graves}, Person {Aysha Graham}, Person {Melissa Carpenter}, Person {Marie Daniel}, Person {Robin French}, Person {Annie Bradley}]
I-N=[Person {Jasmine Knight}, Person {Madeleine Jenkins}, Person {Christina Johnson}, Person {Freya Montgomery}]
O-Z=[Person {Phoebe Reyes}, Person {Tamara Wyatt}, Person {Lacey Todd}, Person {Heather Parker}, Person {Lauren Wright}]
按组合并返回结果 1,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。 相关代码可以参考 dubbo 项目中的示例 配置 搜索所有分组 <dubbo:reference interface="com.xxx.MenuService" group="*" merger="true" /> 合并指定分组
给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。
设想一个集合,该集合在聚合的$match操作符上返回具有此结构的文档数组 所以基本上每个返回的文档都共享一个片段(这就是我将如何对它们进行分组),但是每个文档都有一个子文档数组,每个子文档都有不同的_id。 因此,当我使用{slug:“a”}执行$match聚合时,它返回一个数组
本文向大家介绍MongoDB聚合分组多个结果,包括了MongoDB聚合分组多个结果的使用技巧和注意事项,需要的朋友参考一下 要聚合多个结果,请在MongoDB中使用$group。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是汇总组多个结果的查询- 这将产生以下输出-
我正在尝试使用Elasticsearch(2.4)聚合对使用该查询的多个索引按“productId”分组 1) 我想按分数排序,所以我尝试使用 哪个返回 2) 此外,我正在尝试使用分页,“size”键实际起作用,但“from”键不起作用 **更新-聚合结果示例** 希望有人能帮忙
问题内容: 我有一个表的数组列类型: 我想写一个查询,每个标题生成一个数组(理想情况下,它将是一个设置/去重复的数组) 例如 上面的查询当然行不通,但是我想产生2行: 任何帮助或指针将不胜感激(我使用的是Postgres 9.1) 基于Craig的帮助,我得出以下结论(语法略有更改,因为9.1完全按照他的显示抱怨该查询) 问题答案: 自定义汇总 方法1:定义自定义集合。这是我之前写的。 横向查询