给出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
,但我不知道如何使用。
答案 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()));