按从枚举中获取的值按自定义顺序对列表 <Object> 进行排序
Sorting List<Object> in custom order by value fetched from Enum
我有一个 class 如下:
public class Status implements Serializable, Comparable<Status>{
private int requestStatus;
@Column(name = "STATUS")
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
status中的值通过Enum存储在前端,代码如下:
public enum StatusEnum {
REQUESTED(0), CANCELED(-1), VALIDATED(10), ONGOING(20), FINISHED(30);
private int intValue;
private StatusEnum (int intValue) {
this.intValue = intValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String getName() {
return this.name();
}
public static StatusEnum getStatusFromEnum(int code) {
for (StatusEnum status : StatusEnum.values()) {
if (status.getIntValue() == code) {
return status;
}
}
return null;
}
public static StatusEnum getStatusFromString(String name) {
for (StatusEnum status : StatusEnum .values()) {
if (status.name().equalsIgnoreCase(name)) {
return status;
}
}
return null;
}
因此,我愿意按照自定义顺序对该列表进行排序,以显示在 Web 部件上以进一步执行某些操作。我想要的顺序如下:
1: Requested (0) 2: Validated (10) 3: Ongoing(20) 4: Finished(30) 5:
Cancelled (-1)
有人可以帮我排序代码来排列这个 List<Status> status
对象吗?如果有人能按照上面提到的以下顺序排序显示在web端,那将是一个很大的帮助。
提前致谢
使用自定义比较器实现这一点非常简单,然后您可以将其传递给 Arrays.sort() 或任何集合的 sort()。
鉴于您不希望这些值根据 intValue 按升序排序,您可以向 StatusEnum 添加一个附加字段(例如 int sortPriority),其中较低的值将首先排序。
Comparator.comparingInt(status -> status.sortPriority));
我觉得你需要的是public int compareTo(Status o)
的实现函数,排序方法是:
当值大于0时,从小到大排序,当值小于0时,放在列表末尾。
下面是实现的函数:
@Override
public int compareTo(Status o) {
//all >=0, sort by value
if (status >= 0 && o.status >= 0) {
return Integer.compare(status, o.status);
}
// all <=0, equals
if (status < 0 && o.status < 0) {
return 0;
}
//one >=0, the other one <0, put the <0 value to the end of the list
if (status < 0) {
return 1;
} else {
return -1;
}
}
然后使用排序功能Collections.sort(status)
排序就可以了。
这是我的测试:
class Status implements Serializable, Comparable<Status> {
private int status;
public Status(int status) {
this.status = status;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public int compareTo(Status o) {
//all >=0, sort by value
if (status >= 0 && o.status >= 0) {
return Integer.compare(status, o.status);
}
// all <=0, equals
if (status < 0 && o.status < 0) {
return 0;
}
//one >=0, the other one <0, put the <0 value to the end of the list
if (status < 0) {
return 1;
} else {
return -1;
}
}
@Override
public String toString() {
return "Status{" +
"status=" + status +
'}';
}
}
public static void main(String[] args) {
Status REQUESTED = new Status(0);
Status CANCELED = new Status(-1);
Status VALIDATED = new Status(10);
Status ONGOING = new Status(20);
Status FINISHED = new Status(30);
List<Status> statusList = Arrays.asList(REQUESTED, CANCELED, VALIDATED, ONGOING, FINISHED);
Collections.sort(statusList);
//prints
//[Status{status=0}, Status{status=10}, Status{status=20}, Status{status=30}, Status{status=-1}]
System.out.println(statusList);
}
我有一个 class 如下:
public class Status implements Serializable, Comparable<Status>{
private int requestStatus;
@Column(name = "STATUS")
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
status中的值通过Enum存储在前端,代码如下:
public enum StatusEnum {
REQUESTED(0), CANCELED(-1), VALIDATED(10), ONGOING(20), FINISHED(30);
private int intValue;
private StatusEnum (int intValue) {
this.intValue = intValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String getName() {
return this.name();
}
public static StatusEnum getStatusFromEnum(int code) {
for (StatusEnum status : StatusEnum.values()) {
if (status.getIntValue() == code) {
return status;
}
}
return null;
}
public static StatusEnum getStatusFromString(String name) {
for (StatusEnum status : StatusEnum .values()) {
if (status.name().equalsIgnoreCase(name)) {
return status;
}
}
return null;
}
因此,我愿意按照自定义顺序对该列表进行排序,以显示在 Web 部件上以进一步执行某些操作。我想要的顺序如下:
1: Requested (0) 2: Validated (10) 3: Ongoing(20) 4: Finished(30) 5: Cancelled (-1)
有人可以帮我排序代码来排列这个 List<Status> status
对象吗?如果有人能按照上面提到的以下顺序排序显示在web端,那将是一个很大的帮助。
提前致谢
使用自定义比较器实现这一点非常简单,然后您可以将其传递给 Arrays.sort() 或任何集合的 sort()。
鉴于您不希望这些值根据 intValue 按升序排序,您可以向 StatusEnum 添加一个附加字段(例如 int sortPriority),其中较低的值将首先排序。
Comparator.comparingInt(status -> status.sortPriority));
我觉得你需要的是public int compareTo(Status o)
的实现函数,排序方法是:
当值大于0时,从小到大排序,当值小于0时,放在列表末尾。
下面是实现的函数:
@Override
public int compareTo(Status o) {
//all >=0, sort by value
if (status >= 0 && o.status >= 0) {
return Integer.compare(status, o.status);
}
// all <=0, equals
if (status < 0 && o.status < 0) {
return 0;
}
//one >=0, the other one <0, put the <0 value to the end of the list
if (status < 0) {
return 1;
} else {
return -1;
}
}
然后使用排序功能Collections.sort(status)
排序就可以了。
这是我的测试:
class Status implements Serializable, Comparable<Status> {
private int status;
public Status(int status) {
this.status = status;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
@Override
public int compareTo(Status o) {
//all >=0, sort by value
if (status >= 0 && o.status >= 0) {
return Integer.compare(status, o.status);
}
// all <=0, equals
if (status < 0 && o.status < 0) {
return 0;
}
//one >=0, the other one <0, put the <0 value to the end of the list
if (status < 0) {
return 1;
} else {
return -1;
}
}
@Override
public String toString() {
return "Status{" +
"status=" + status +
'}';
}
}
public static void main(String[] args) {
Status REQUESTED = new Status(0);
Status CANCELED = new Status(-1);
Status VALIDATED = new Status(10);
Status ONGOING = new Status(20);
Status FINISHED = new Status(30);
List<Status> statusList = Arrays.asList(REQUESTED, CANCELED, VALIDATED, ONGOING, FINISHED);
Collections.sort(statusList);
//prints
//[Status{status=0}, Status{status=10}, Status{status=20}, Status{status=30}, Status{status=-1}]
System.out.println(statusList);
}