【问题标题】:Sorting List<Object> in custom order by value fetched from Enum [closed]按从枚举中获取的值按自定义顺序对 List<Object> 进行排序 [关闭]
【发布时间】:2021-06-07 23:48:43
【问题描述】:

我有一堂课如下:

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中的值通过枚举存储在前端,代码如下:

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:已请求 (0) 2:已验证 (10) 3:正在进行 (20) 4:已完成 (30) 5: 已取消 (-1)

谁能帮我整理这个List&lt;Status&gt; status对象的排序代码?如果有人可以按照上面提到的以下顺序对其进行排序以将其显示在Web端,那将有很大帮助。

提前致谢

【问题讨论】:

标签: java sorting data-structures collections comparable


【解决方案1】:

使用自定义比较器很容易实现,然后您可以将其传递给 Arrays.sort() 或任何集合的 sort()。
鉴于您不希望这些按 intValue 升序排序,您可以在 StatusEnum 中添加一个附加字段(例如 int sortPriority),其中较低的值将首先排序。

Comparator.comparingInt(status -> status.sortPriority));

【讨论】:

    【解决方案2】:

    我想你需要的是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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多