基于java中的参数对对象进行排序

时间:2017-09-22 10:53:10

标签: java list sorting

我有一个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;
            }
        });
    }

3 个答案:

答案 0 :(得分:1)

如果以这种方式定义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());
        }
    });
}

当然,如果您想使用sort编写并调用java8,则使用lambda表达式是等效的:

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

答案 1 :(得分: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 :(得分:0)

您只需按自己喜欢的顺序排列statuses即可 然后你的排序很简单:

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