【问题标题】:Sorting this Map<String, FullName> in Java在 Java 中对此 Map<String, FullName> 进行排序
【发布时间】:2018-11-16 19:40:04
【问题描述】:

我有一个 Map,其中 FullName 是一个对象,并且包含另一个包含 FirstName 和 LastName 的类 Name 对象。名字和姓氏是字符串。 (是的,我知道这是一个糟糕的设计,但我正在努力学习排序)

key 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()));
    }
}

【问题讨论】:

  • 您想比较 Map 条目。所以你需要的是 Comparator>,而不是 Comparator
  • 拥有 FullName 的代码会很有帮助,因为它用于您共享的代码和实际错误中。有关如何编写好问题的更多建议,请参阅:stackoverflow.com/help/how-to-ask

标签: java sorting hashmap


【解决方案1】:

您的比较器用于String 对象,但map.entrySet().stream() 返回Entry&lt;String, FullName&gt; 对象流。

按照cmets中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());
  }
}

【讨论】:

  • 一个更好的解决方案是使用Comparator.comparing(e -&gt; e.getValue().getName().getFirstName())
  • @JBNizet 我不知道这个功能,太好了!
  • 我相信您可以进行调整以比较两者:) 也许试一试,如果遇到麻烦,您可以提出一个新问题。很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多