Java 使用比较器和内部排序 类

Java sorting with Comparator and Inner classes

给定 Java 类 的组合:

public class OuterClass
    {
        public String           field01;
        public int              field02;
        public InnerClass       innerField
        // ...getters, setters

    public class InnerClass
        {
            public int              innerField01;
            public BigDecimal       innerField02;
            // ...getters, setters

我想按外部和内部字段对它们进行排序。现在,给定一个 List<OuterClass> list,我可以很容易地通过 field01 和:

对其进行排序
Collections.sort(list, Comparator.comparing(OuterClass::getField01));

但是我可以按 InnerClass.innerfield.innerfield01 哪种方式排序?我试过了

Collections.sort(list, Comparator.comparing(OuterClass::InnerField::innerField01));

和其他一些方法,但没有成功。 也许我应该以某种方式使用 OuterClass::new,但我不知道如何使用。

Collections.sort(list, Comparator.comparing(obj -> obj.getInnerField().getInnerField01()));

让外部和内部 class 实现 Comparable 并向两者添加 compareTo 方法,或者只让外部 class 实现它并在那里处理所有比较。哪种方式最好取决于您想要比较的方式,在下面的示例中,Outer 首先排序,然后是 Inner

public class OuterClass implements Comparable{
    public String           field01;
    public int              field02;
    public InnerClass       innerField;

    public class InnerClass implements Comparable {
        public int              innerField01;
        public BigDecimal       innerField02;

        @Override
        public int compareTo(Object o) {
            //...
        }
    }

    @Override
    public int compareTo(Object o) {
        OuterClass obj = (OuterClass)o;
        int res = field01.compareTo(obj.field01);

        if (res != 0) {
            return res;
        }
        return this.innerField.compareTo(obj.innerField);
    }
}

您可以这样使用 Comparator.comparing(Function, Comparator)

Collections.sort(list, 
  Comparator.comparing(OuterClass::getInnerField, 
    Comparator.comparingInt(InnerClass::getInnerField01)));

第一个参数是用于提取要排序的键的函数。在您的情况下:OuterClass 中的 Innerfield

第二个参数是用于比较排序键的Comparator。在您的情况下:Comparator 用于 InnerField 的字段之一(上例中的 innerField01)。