使用Comparator和Inner类进行Java排序

时间:2018-08-04 14:17:15

标签: java sorting comparator 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,但我不知道如何使用。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:-1)

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