简体   繁体   English

使用比较器对 VO 的嵌套列表进行排序

[英]Sorting nested list of VO with Comparator

I am trying to sort a nested VO with comparator.我正在尝试使用比较器对嵌套的 VO 进行排序。 I am able to do it with collection sort, but intellij shows a warning we must use comparators.我可以使用集合排序来做到这一点,但 Intellij 显示了一个警告,我们必须使用比较器。 But I could not figure this usage when we have list of object with nest objects.但是当我们有带有嵌套对象的对象列表时,我无法弄清楚这种用法。

Reports Comparators defined as lambda expressions which could be expressed using methods like Comparator.comparing().报告定义为 lambda 表达式的比较器,可以使用 Comparator.comparing() 等方法表示。 Some comparators like (person1, person2) -> person1.getName().compareTo(person2.getName()) could be simplified like this: Comparator.comparing(Person::getName).一些比较器,如 (person1, person2) -> person1.getName().compareTo(person2.getName()) 可以这样简化:Comparator.comparing(Person::getName)。 Also suggests to replace chain comparisons with Comparator.thenComparing(), eg int res = o1.first.compareTo(o2.first);还建议用 Comparator.thenComparing() 替换链比较,例如 int res = o1.first.compareTo(o2.first); if(res == 0) res = o1.second.compareTo(o2.second); if(res == 0) res = o1.second.compareTo(o2.second); if(res == 0) res = o1.third - o2.third; if(res == 0) res = o1.third - o2.third; return res;返回资源; will be replaced with objs.sort(Comparator.comparing((Obj o) -> o.first).thenComparing(o -> o.second).thenComparingInt(o -> o.third));将被替换为 objs.sort(Comparator.comparing((Obj o) -> o.first).thenComparing(o -> o.second).thenComparingInt(o -> o.third));

Here is my class这是我的课

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

} }

Class B 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;
    }

}

Current sorting done is sortBaseVOList is a list of sortBaseVO当前完成的排序是 sortBaseVOList 是 sortBaseVO 的列表

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

Can I change this to use Comparator?我可以将其更改为使用比较器吗?

I simulated your problem. 我模拟了您的问题。

I suggest the following alternative as the right way to fix this warning: 我建议使用以下替代方法作为纠正此警告的正确方法:

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

where in your SortBaseVO class you must to define the following method: 您必须在SortBaseVO类中的何处定义以下方法:

public class SortBaseVO {

    // all other methods

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

  Collections.sort(list,
        Comparator.comparing(sbVO -> sbVO.getSortBaseVO2().getB().concat(sbVO.getSortBaseVO2().getD())));

You can get the same anwser if you hit 'alt+Enter', then 'Replace with Comparator'. 如果您按“ alt + Enter”,然后单击“用比较器替换”,则可以获得相同的答案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM