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