【问题标题】:Sorting nested list of VO with Comparator使用 Comparator 对 VO 的嵌套列表进行排序
【发布时间】:2019-07-26 10:29:56
【问题描述】:

我正在尝试使用比较器对嵌套的 VO 进行排序。我可以使用集合排序来做到这一点,但 intellij 显示警告我们必须使用比较器。但是当我们有包含嵌套对象的对象列表时,我无法理解这种用法​​。

报告比较器定义为 lambda 表达式,可以使用 Comparator.comparing() 等方法表示。一些比较器 喜欢 (person1, person2) -> person1.getName().compareTo(person2.getName()) 可以简化 像这样:Comparator.comparing(Person::getName)。还建议 用 Comparator.thenComparing() 替换链比较,例如整数 res = o1.first.compareTo(o2.first);如果(资源 == 0)资源 = o1.second.compareTo(o2.second); if(res == 0) res = o1.third - o2.第三;返回资源;将被替换为 objs.sort(Comparator.comparing((Obj o) -> o.first).thenComparing(o -> o.second).thenComparingInt(o -> o.third));

这是我的课

public class SortBaseVO {

public SortBaseVO(String prop1, String prop2, String prop3, String prop4, String sortBaseVO2) {
    this.prop1 = prop1;
    this.prop2 = prop2;
    this.prop3 = prop3;
    this.prop4 = prop4;
    this.sortBaseVO2 = sortBaseVO2;
}

private String prop1;

private String prop2;

private String prop3;

private String prop4;

private String sortBaseVO2;

public String getSortBaseVO2() {
    return sortBaseVO2;
}

public void setSortBaseVO2(String sortBaseVO2) {
    this.sortBaseVO2 = sortBaseVO2;
}

public String getProp1() {
    return prop1;
}

public void setProp1(String prop1) {
    this.prop1 = prop1;
}

public String getProp2() {
    return prop2;
}

public void setProp2(String prop2) {
    this.prop2 = prop2;
}

public String getProp3() {
    return prop3;
}

public void setProp3(String prop3) {
    this.prop3 = prop3;
}

public String getProp4() {
    return prop4;
}

public void setProp4(String prop4) {
    this.prop4 = prop4;
}

}

B类

public class SortBaseVO2 {


    private String a;

    private String b;

    private String c;

    private String d;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

    public String getD() {
        return d;
    }

    public void setD(String d) {
        this.d = d;
    }

}

当前完成的排序是 sortBaseVOList 是一个 sortBaseVO 列表

Collections.sort(sortBaseVOList , (sortBaseVO1, sortBaseVO2) ->
        sortBaseVO1.getsortBaseVO2().getB().concat(sortBaseVO1.getsortBaseVO2().getD())
        .compareTo(sortBaseVO2.getsortBaseVO2().getB().concat(sortBaseVO2.getsortBaseVO2().getD()));

我可以将其更改为使用 Comparator 吗?

【问题讨论】:

  • 不确定我是否正确理解了这个问题。如果不想在 Collections.sort() 中定义比较器,则必须通过 VO 类实现 Comparable 接口。
  • 某些类型在您的示例中定义错误。例如,属性 SortBaseVO#sortBaseVO2 被定义为 String,但我来宾说类型应该是 SortBaseVO2。

标签: java spring lambda java-8 java-stream


【解决方案1】:

我模拟了你的问题。

我建议以下替代方法作为解决此警告的正确方法:

List<SortBaseVO> sortBaseVOList = new ArrayList<>();
Collections.sort(sortBaseVOList , Comparator.comparing(SortBaseVO::getConcat));

您必须在 SortBaseVO 类中定义以下方法:

public class SortBaseVO {

    // all other methods

    public String getConcat() {
        return getSortBaseVO2().getB().concat(getSortBaseVO2().getD());
    }
}

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多