当前位置: 首页 > 知识库问答 >
问题:

在Java中对该映射进行排序

巫马安怡
2023-03-14

我有一个映射,其中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()));
    }
}

共有1个答案

东门清夷
2023-03-14

比较器用于字符串对象,但用于映射。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现在存储在对象中。