【问题标题】:How to sort list with two object fields?如何使用两个对象字段对列表进行排序?
【发布时间】:2019-03-11 18:27:33
【问题描述】:

早安!

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

我有一个示例列表:

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()”排序,而不是按购买数量排序。

有什么建议吗?

谢谢

【问题讨论】:

标签: java list sorting collections


【解决方案1】:
 Collections.sort(
     testImportados, 
     Comparator.comparing(BeanRelEstatisticaMateriaPrima::getMesesduration)
                     .thenComparing(BeanRelEstatisticaMateriaPrima::getQtyBuy));

如果您已经在使用 java-8,这应该是提供正确 Comparator 的最简单方法。

【讨论】:

  • 我需要Java版本小于8。
【解决方案2】:

我不明白你的方法。

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

    }
});

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

【讨论】:

    【解决方案3】:

    我想你想先按数量排序,然后按持续时间。

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

    【讨论】:

      【解决方案4】:

      我忘了提,我在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()

      我不明白。

      【讨论】:

        猜你喜欢
        • 2011-07-09
        • 1970-01-01
        • 2019-06-07
        • 2019-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多