【发布时间】:2023-04-10 19:59:01
【问题描述】:
除了对分组属性进行排序之外,我的问题已通过以下答案解决。
Dynamic grouping by specific attributes with Collection.stream
如何根据升序或降序的属性从按排序顺序设置的值中检索列表。一个组属性可以升序,而另一个可以降序。
我创建了一个 GroupClass 作为参数而不是字符串数组。
public class MyClass {
public String title;
public String type;
public String module;
public MyClass(String title, String type, String module) {
this.type = type;
this.title = title;
this.module = module;
}
@Override
public String toString() {
return "MyClass [title=" + title + ", type=" + type + ", module=" + module + "]";
}
private static Map<List<String>, List<MyClass>> groupListBy(List<MyClass> data, List<GroupClass> groupFieldList) {
final MethodHandles.Lookup lookup = MethodHandles.lookup();
List<MethodHandle> handles = groupFieldList.stream().map(groupField -> {
try {
return lookup.findGetter(MyClass.class, groupField.getFieldName(), String.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
return data.stream().collect(Collectors.groupingBy(d -> handles.stream().map(handle -> {
try {
return (String) handle.invokeExact(d);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList())));
}
public static void main(String[] args) {
List<MyClass> data = new ArrayList<>();
data.add(new MyClass("Title1", "TYPEA", "MB"));
data.add(new MyClass("Title2", "TYPEA", "MB"));
data.add(new MyClass("Title3", "TYPEA", "MC"));
data.add(new MyClass("Title4", "TYPEB", "MA"));
List<GroupClass> groupFieldList = new ArrayList<>();
groupFieldList.add(new GroupClass("type","asc"));
groupFieldList.add(new GroupClass("module","asc"));
System.out.println(groupListBy(data, groupFieldList));
}
}
public class GroupClass {
String name;
String order;
public GroupClass(String fieldName, String fieldOrder) {
super();
this.name = fieldName;
this.order = fieldOrder;
}
public String getFieldName() {
return name;
}
public void setFieldName(String fieldName) {
this.name = fieldName;
}
public String getFieldOrder() {
return order;
}
public void setFieldOrder(String fieldOrder) {
this.order = fieldOrder;
}
}
输出:
{
[TYPEA, MC]=[MyClass [title=Title3, type=TYPEA, module=MC]],
[TYPEA, MB]=[MyClass [title=Title1, type=TYPEA, module=MB], MyClass [title=Title2, type=TYPEA, module=MB]],
[TYPEB, MA]=[MyClass [title=Title4, type=TYPEB, module=MA]]
}
我想要达到的输出:
{
[TYPEB, MA]=[MyClass [title=Title4, type=TYPEB, module=MA]],
[TYPEA, MB]=[MyClass [title=Title1, type=TYPEA, module=MB], MyClass [title=Title2, type=TYPEA, module=MB]],
[TYPEA, MC]=[MyClass [title=Title3, type=TYPEA, module=MC]]
}
以上输出按“type”列降序排序,“module”列升序排序。
【问题讨论】:
-
链接问答的代码产生一个
Map<List<String>, List<MyClass>>你想按什么标准排序? -
如果您期待排序,请尝试流式传输获得的
Map条目并根据Comparator(作为方法参数)对它们进行排序,同时将它们收集回@ 987654329@. -
您可以创建两个比较器,一个用于
title,另一个用于module,然后通过使用这两个比较器来使用chained comparator -
在您的示例代码中,您使用
"asc"初始化两个GroupClass对象,这与您希望将"type"列按降序排列的描述相矛盾。当你解决这个问题时,my solutions 都会提供所需的结果。
标签: java sorting java-8 group-by comparator