在Java

时间:2018-11-16 19:40:05

标签: java sorting hashmap

我有一个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()));
    }
}

1 个答案:

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