【问题标题】:Sort Object on the basis of parameter in javajava中根据参数对对象进行排序
【发布时间】:2017-09-22 10:53:09
【问题描述】:

我有一个 Java 类 SalesDataJson,如下所示。不同的状态值是“READY”、“PICKED”和“PACKED”。

SalesDataJson.java

public class SalesDataJson {
    private Long salesOrderNumber;
    private String status;
 }

现在我想按状态“READY”、“PICKED”和“PACKED”的顺序订购“SalesDataJson”对象。谁能帮我解决这个问题。

我已经完成了下面的代码,但它不起作用:-

   public void sort(){
        Collections.sort(salesDataJsons, new Comparator<SalesDataJson>() {
            @Override
            public int compare(SalesDataJson o1, SalesDataJson o2) {
                if (o1.getStatus() == PackagingStatus.RTW && o2.getStatus() == PackagingStatus.PICKED)
                    return -1;
                else if (o1.getStatus() == PackagingStatus.PICKED && o2.getStatus() == PackagingStatus.RTW)
                    return 1;
                else if (o1.getStatus() == PackagingStatus.RTW && o2.getStatus() == PackagingStatus.PACKED)
                    return -1;
                else if (o1.getStatus() == PackagingStatus.PACKED && o2.getStatus() == PackagingStatus.RTW)
                    return 1;
                else if (o1.getStatus() == PackagingStatus.PICKED && o2.getStatus() == PackagingStatus.PACKED)
                    return -1;
                else if (o1.getStatus() == PackagingStatus.PACKED && o2.getStatus() == PackagingStatus.PICKED)
                    return 1;
                return 0;
            }
        });
    }

【问题讨论】:

    标签: java list sorting


    【解决方案1】:

    制作一个这样的辅助方法:

    int getSortOrder(String status) {
        switch(status) {
            case PackagingStatus.RTW: 1; break;
            case PackagingStatus.PICKED: 2; break;
            case PackagingStatus.PACKED: 3; break;
            default:
                throw new RuntimeException("Unknown status" + status);
        }
    }
    

    那你就可以了

    new Comparator<SalesDataJson>() {
        @Override
        public int compare(SalesDataJson o1, SalesDataJson o2) {
            return Integer.compare(getSortOrder(o1.getStatus), getSortOrder(o2.getStatus)));
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您的PackagingStatus 枚举以这种方式定义(按您喜欢的方式排序):

      public enum PackagingStatus{
          RTW, PICKED, PACKED;
      }
      

      你可以只使用ordinal(),它返回枚举中的位置。

      public void sort(){
          Collections.sort(salesDataJsons, new Comparator<SalesDataJson>() {
              @Override
              public int compare(SalesDataJson o1, SalesDataJson o2) { 
                  return (o1.getStatus().ordinal() - o2.getStatus().ordinal());
              }
          });
      }
      

      无论如何,这不是真的推荐,因为它很脆弱,一个小的重新排序可能会破坏你的排序。

      您可以将此排序逻辑附加到帮助程序类中(如@Stephen Friedrich)建议或直接附加到enum 本身(即使使用String 状态再次不理想,我会将其替换为PackagingStatus直接):

      public enum PackagingStatus {
          PICKED(1), PACKED(2), RTW(3);
      
          PackagingStatus(int position) {
              this.position = position;
          }
      
          private final int position;
      
          public int getPosition() {
              return position;
          }
      }
      

      那么sort就变成了:

      public void sort(){
          Collections.sort(salesDataJsons, new Comparator<SalesDataJson>() {
              @Override
              public int compare(SalesDataJson o1, SalesDataJson o2) { 
                  return (o1.getStatus().getPosition() - o2.getStatus().getPosition());
              }
          });
      }
      

      当然,如果您想使用java8 编写和调用sort,这等效于使用 lambda 表达式:

      Collections.sort(
          salesDataJsons,
          (o1, o2) ->
              o1.getStatus().getPosition() - o2.getStatus().getPosition()
      );
      

      【讨论】:

        【解决方案3】:

        您只需按照您喜欢的顺序排列statuses 那么你的排序就这么简单了:

        List<SalesDataJson> sortedList = orignalList.stream()
                       .sorted(Comparator.comparing(SalesDataJson::getStatus))
                       .collect(Collectors.toList());
        

        【讨论】:

          猜你喜欢
          • 2018-08-16
          • 2021-09-23
          • 1970-01-01
          • 2013-11-25
          • 2021-02-07
          • 2011-08-12
          • 2020-12-15
          • 2019-03-28
          • 2015-01-03
          相关资源
          最近更新 更多