我有一个映射,其中FullName是一个对象,包含另一个类名为FirstName和LastName的对象。名字和姓氏是字符串。(是的,我知道这是一个糟糕的设计,但我正在努力学习排序)
密钥字符串只是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()));
}
}
比较器用于字符串
对象,但用于映射。entrySet()。stream()
返回条目流
正如JB在评论中所建议的,您可以使用静态的
比较器
方法#comparing
快速构建比较器
:
List<String> listofIds = map.entrySet().stream().sorted(
Comparator.comparing(e -> e.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());
您可以利用
比较器
这样的功能接口:
List<String> listofIds = map.entrySet().stream().sorted(
(e1, e2) -> e1.getValue().getName().getFirstName().compareTo(
e2.getValue().getName().getFirstName())
).map(Map.Entry::getKey).collect(toList());
如果仍要使用
比较器
对象,可以使用:
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());
}
}
问题内容: 我有一堂水果课。我正在创建此类的列表,并将每个水果添加到列表中。我想根据水果名称的顺序对该列表进行排序。 我正在使用for循环创建它的列表 我需要使用列表中每个对象的水果名称对该arrayList进行排序 问题答案: 使用这样的: 现在,你的水果清单将基于进行排序。
问题内容: 我们如何排序? 我想根据中的值进行排序。 问题答案: 你是否必须使用HashMap?如果只需要Map Interface,请使用TreeMap 如果要通过比较HashMap中的值进行排序。你必须编写代码才能执行此操作,如果要执行此操作,则可以对HashMap的值进行排序: 如果你想经常访问此排序列表,则可以将元素插入到中,尽管集合和列表的语义有些不同。
问题内容: 我不能在数据库中执行ORDER BY 问题答案: 将数据从ResultSet中移到所需的任何对象表示形式中,然后对数据进行排序,就像此时的其他任何数据一样。 如果您使用Collections.Sort对复杂对象进行排序,则需要实现Comparator。
问题内容: 如何按对象的字段对对象的JSONArray排序? 输入: 所需的输出(按“名称”字段排序): 问题答案: 试试这个: 排序后的JSONArray现在存储在对象中。