按从枚举中获取的值按自定义顺序对列表 <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);
}