我有一个Map,其中FullName是一个对象,并且包含另一个Name类的对象,该对象包含FirstName和LastName。名和姓是String。 (是的,我知道它的设计不好,但是我正在尝试学习排序)
键String只是id,例如1,2,3,...
我想基于全名(名字和姓氏)进行排序,并只返回ID列表。
这是我到目前为止的代码,但是在通过比较器的排序部分上出现语法错误。而且我也很确定自己在语义上也做错了。
List<String> listofIds = map.entrySet().stream()
.sorted(new ValueComparator(map))
.map(Map.Entry::getKey)
.collect(toList());
class ValueComparator implements Comparator<String> {
Map<String, FullName> base;
public ValueComparator(Map<String, FullName> base) {
this.base = base;
}
public int compare(String a, String b) {
FullName fullName1 = base.get(a);
FullName fullName2 = base.get(b);
return(fullName1.getName().getFirstName()
.compareTo(fullName2.getName().getFirstName()));
}
}
答案 0 :(得分:2)
您的比较器用于String
个对象,但是map.entrySet().stream()
返回Entry<String, FullName>
个对象的流。
如JB在评论中所建议,您可以使用静态Comparator
方法#comparing
快速构建Comparator
:
List<String> listofIds = map.entrySet().stream().sorted(
Comparator.comparing(e -> e.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());
您可以利用Comparator
这样的功能界面:
List<String> listofIds = map.entrySet().stream().sorted(
(e1, e2) -> e1.getValue().getName().getFirstName().compareTo(
e2.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());
如果您仍然想使用Comparator
对象,则可以使用:
private static class ValueComparator implements Comparator<Entry<String, FullName>> {
@Override
public int compare(Entry<String, FullName> e1, Entry<String, FullName>> e2) {
FullName fullName1 = e1.getValue();
FullName fullName2 = e2.getValue();
return fullName1.getName().getFirstName()
.compareTo(fullName2.getName().getFirstName());
}
}