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
)。
给定 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
)。