如何使用两个对象字段对列表进行排序?

时间:2018-10-06 12:55:16

标签: java list sorting collections

早上好!

我正在尝试按两个字段比较列表,但结果不起作用,您能帮我吗?

我有一个示例列表:

Name - MesesDuracao - Buy
A    - 1            - 10
A    - 2            - 5
B    - 1            - 8

我希望订购显示如下:

A-1-10
B-1-8
A-2-5

我正在尝试这种方式:

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
    {    

        int comparison = p1.getMesesduration (). compareTo (p2.getMesesduration ());
        return comparison == 0? p1.getQtyBuy (). compareTo (p2.getQtyBuy ()): comparison;  

    }
});

但是,它仅按“ getMesesduration()”进行排序,而不按购买的数量进行排序。

有什么建议吗?

谢谢

4 个答案:

答案 0 :(得分:3)

 Collections.sort(
     testImportados, 
     Comparator.comparing(BeanRelEstatisticaMateriaPrima::getMesesduration)
                     .thenComparing(BeanRelEstatisticaMateriaPrima::getQtyBuy));

如果已经使用了Java-8,它应该是提供正确的Comparator的最简单方法。

答案 1 :(得分:0)

我不明白您的方法。

  • getQtyComprar()能做什么?
  • getQtyBuy()会做什么?

我认为两种方法是不同的。但是,您正在比较器中比较两个不同的方法调用为p1.getQtyComprar().compareTo(p2.getQtyBuy ())。因此,您最后的Comparator应该采用相同的方法用法表格。

如果您想在第一次比较后比较getQtyComprar,则代码应类似于;

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
    {    

        int comparison = p1.getMesesduration (). compareTo (p2.getMesesduration ());
        return comparison == 0? p1.getQtyComprar (). compareTo (p2.getQtyComprar()): dateComparison;  

    }
});

如果您想在第一次比较后比较getQtyBuy,则代码应类似于;

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
    {    

        int comparison = p1.getMesesduration().compareTo(p2.getMesesduration());
        return comparison == 0? p1.getQtyBuy().compareTo (p2.getQtyBuy()): dateComparison;  

    }
});

由于我的帖子,请仔细选择您的比较方法。

答案 2 :(得分:0)

我认为您想首先按数量排序,然后按持续时间排序。

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2) {
        // first sort by quantity
        int cmp = Integer.compare(p1.getQtyBuy(), p2.getQtyBuy());

        // the quantities are the same, then sort by duration
        if (cmp == 0) {
            cmp = p1.getMesesDuration().compareTo(p2.getMesesDuration());
        }

        return cmp;
    }

答案 3 :(得分:0)

我忘了提一下,我在getQtyBuy中有一个负值,看起来代码已经丢失了。

我尝试了其他代码:

public class CustomerSortingComparator implements Comparator < BeanRelEstatisticaMateriaPrima > {

  @Override
  public int compare(BeanRelEstatisticaMateriaPrima cust1, BeanRelEstatisticaMateriaPrima cust2) {

    // all comparison
    int compareMes = cust1.getMesesduration().compareTo(cust2.getMesesduration());
    int compareBuy = cust1.getQtyBuy().compareTo(cust2.getQtyBuy());
    int compareName = cust1.getProdname().compareTo(cust2.getProdname());

    // 3-level comparison using if-else block
    if (compareMes == 0) {
      return ((compareBuy == 0) ? compareName : compareBuy);
    } else {
      return compareMes;
    }
  }
}
Collections.sort(testImportados, new CustomerSortingComparator());

仅按一个参数getMesesduration()继续排序

我不明白。