对具有较高优先级的一系列元素和具有较低优先级的其他元素的优先级队列进行排序

阿什温·希尔瓦

我有一个包含以下字段的实体类:id、orderNo。每个实体都必须存储在一个 java 优先级队列中。id 在 1 - 3000 之间的元素具有更高的优先级,必须以 orderNo 的升序存储在 id > 3000 的元素之上。 ids > 3000 的元素以 orderNo 的升序存储在更高优先级的元素(ids 1 - 3000)。

例如:

(1st insertion to queue: id=4000 orderNo=1) 
(2nd insertion to queue: id=5000 orderNo=2) 
(3rd insertion to queue: id=100  orderNo=3)
(4th insertion to queue: id=50   orderNo=4)

预期排序顺序:

(id=100  orderNo=3) 
(id=50   orderNo=4) 
(id=4000 orderNo=1) 
(id=5000 orderNo=2)

订单实体类:

public class OrderEntity implements Comparable<OrderEntity> {
    private int id;
    private int getOrderNo;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getOrderNo() {
        return getOrderNo;
    }

    public void setOrderNo(int getOrderNo) {
        this.getOrderNo = getOrderNo;
    }

    @Override
    public int compareTo(OrderEntity arg0) {
        if ((this.getId() >= 1 && this.getId() <= 3000) && (arg0.getId() >= 1 && arg0.getId() <= 3000)) {
            if (this.getOrderNo() > arg0.getOrderNo()) {
                return 1;
            } else {
                return 0;
            }
        } else if ((this.getId() <= 3000) && (arg0.getId() > 3000)) {
            return 1;
        } else if ((this.getId() > 3000) && (arg0.getId() <= 3000)) {
            return 1;
        } else if ((this.getId() > 3000) && (arg0.getId() > 3000)) {
            if (this.getOrderNo() > arg0.getOrderNo()) {
                return 1;
            } else {
                return 0;
            }
        } else {
            return 0;
        }
    }
}

订单处理器类:

public class OrderProcessor {
    private static int count;
    static Queue<OrderEntity> pq = new PriorityQueue<>();

    public String createOrder(int id) {
        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setId(id);
        count = count + 1;
        orderEntity.setOrderNo(count);
        pq.add(orderEntity);

        String res = "";
        for (OrderEntity rd : pq) {
            res = res + rd.getId() + " " + rd.getOrderNo() + "\n";
        }
        return res.trim();
    }
}
迈赫迪·贾万

在这种情况下,对象的自然顺序与您的特殊要求不同,最好不要使用,Comparable因为它将来可能有其他用途。因此,剩下的解决方案正在使用Comparator它非常适合您的问题,因为您的OrderEntity班级不会依赖于这个特殊的比较。以下是显示解决方案的示例代码:

import java.util.Comparator;
import java.util.PriorityQueue;

public class OrderProcessor {
    public static void main(String[] args) {
        PriorityQueue<OrderEntity> q = new PriorityQueue<>(new OrderEntityComparator());
        q.add(new OrderEntity(4000, 1));
        q.add(new OrderEntity(5000, 2));
        q.add(new OrderEntity(100, 3));
        q.add(new OrderEntity(50, 4));

        while(!q.isEmpty())
            System.out.println(q.poll());
    }

    public static class OrderEntityComparator implements Comparator<OrderEntity> {

        @Override
        public int compare(OrderEntity o1, OrderEntity o2) {
            if(o1.getId() <= 3000 && o2.getId() <= 3000)
                return Integer.compare(o1.getOrderNo(), o2.getOrderNo());
            if(o1.getId() > 3000 && o2.getId() > 3000)
                return Integer.compare(o1.getOrderNo(), o2.getOrderNo());
            if(o1.getId() <= 3000 && o2.getId() > 3000)
                return -1;
            return 1;
        }
    }

    public static class OrderEntity {
        private int id;
        private int orderNo;

        public OrderEntity(int id, int orderNo) {
            this.id = id;
            this.orderNo = orderNo;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public int getOrderNo() {
            return orderNo;
        }

        public void setOrderNo(int orderNo) {
            this.orderNo = orderNo;
        }

        @Override
        public String toString() {
            return "OrderEntity{" +
                    "id=" + id +
                    ", orderNo=" + orderNo +
                    '}';
        }
    }
}

编辑:

如果您不想通过调用poll方法删除元素,则必须对数组或列表中的元素进行排序,如下所示:

    OrderEntity[] a = new OrderEntity[q.size()];
    q.toArray(a);
    Arrays.sort(a, new OrderEntityComparator());

    for(OrderEntity entity : a)
        System.out.println(entity);

事实上,在这种情况下,您不需要使用 aPriorityQueue并且对 List 或数组进行简单排序即可完成这项工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果多个元素具有相同的优先级,Python中是否有“ Lifo”类型的优先级队列?

来自分类Dev

确保隐式定义始终具有较高/较低优先级的一般方法

来自分类Dev

如何用O(logN)排序具有n个元素的优先级队列?

来自分类Dev

具有两个优先级Python的优先级队列

来自分类Dev

具有两个优先级值的优先级队列

来自分类Dev

具有两个优先级Python的优先级队列

来自分类Dev

具有优先级的RxJava Zip

来自分类Dev

运行具有高优先级或实时优先级的程序(是的,我已经阅读了其他线程)

来自分类Dev

具有减少键操作的Javascript优先级队列

来自分类Dev

具有自定义顺序的优先级队列

来自分类Dev

创建具有相反顺序的优先级队列

来自分类Dev

基于元素字段具有元素唯一性的优先级队列的数据结构

来自分类Dev

具有优先约束的SSIS控制流优先级

来自分类Dev

如何在具有特定优先级列表的元素之间进行选择?

来自分类Dev

在相等的情况下,对具有值和时间优先级的LinkedHashMap进行排序

来自分类Dev

如何以恒定步长填充数组元素之间的间距,并结合具有优先级和次要优先级的两个这样的数组?

来自分类Dev

C ++实现具有不同优先级功能的优先级队列的最佳方法是什么?

来自分类Dev

Dijkstra的最短路径算法,具有部分排序的树作为优先级队列

来自分类Dev

最小优先级队列和最大优先级队列未正确排序

来自分类Dev

C ++优先级队列-根据更新的优先级进行重新排序

来自分类Dev

C ++优先级队列-根据更新的优先级进行重新排序

来自分类Dev

具有指针和比较器C ++的优先级队列

来自分类Dev

具有邻接表和优先级队列的Dijkstra算法

来自分类Dev

用Java排序优先级队列

来自分类Dev

C ++优先级队列-排序间隔

来自分类Dev

C ++优先级队列未排序

来自分类Dev

如何对列表列表进行排序以保留具有最高优先级的项目?(Python)

来自分类Dev

较高优先级的线程获得与较低优先级相同的CPU数量?

来自分类Dev

较低优先级的线程似乎会阻塞较高优先级的线程?

Related 相关文章

  1. 1

    如果多个元素具有相同的优先级,Python中是否有“ Lifo”类型的优先级队列?

  2. 2

    确保隐式定义始终具有较高/较低优先级的一般方法

  3. 3

    如何用O(logN)排序具有n个元素的优先级队列?

  4. 4

    具有两个优先级Python的优先级队列

  5. 5

    具有两个优先级值的优先级队列

  6. 6

    具有两个优先级Python的优先级队列

  7. 7

    具有优先级的RxJava Zip

  8. 8

    运行具有高优先级或实时优先级的程序(是的,我已经阅读了其他线程)

  9. 9

    具有减少键操作的Javascript优先级队列

  10. 10

    具有自定义顺序的优先级队列

  11. 11

    创建具有相反顺序的优先级队列

  12. 12

    基于元素字段具有元素唯一性的优先级队列的数据结构

  13. 13

    具有优先约束的SSIS控制流优先级

  14. 14

    如何在具有特定优先级列表的元素之间进行选择?

  15. 15

    在相等的情况下,对具有值和时间优先级的LinkedHashMap进行排序

  16. 16

    如何以恒定步长填充数组元素之间的间距,并结合具有优先级和次要优先级的两个这样的数组?

  17. 17

    C ++实现具有不同优先级功能的优先级队列的最佳方法是什么?

  18. 18

    Dijkstra的最短路径算法,具有部分排序的树作为优先级队列

  19. 19

    最小优先级队列和最大优先级队列未正确排序

  20. 20

    C ++优先级队列-根据更新的优先级进行重新排序

  21. 21

    C ++优先级队列-根据更新的优先级进行重新排序

  22. 22

    具有指针和比较器C ++的优先级队列

  23. 23

    具有邻接表和优先级队列的Dijkstra算法

  24. 24

    用Java排序优先级队列

  25. 25

    C ++优先级队列-排序间隔

  26. 26

    C ++优先级队列未排序

  27. 27

    如何对列表列表进行排序以保留具有最高优先级的项目?(Python)

  28. 28

    较高优先级的线程获得与较低优先级相同的CPU数量?

  29. 29

    较低优先级的线程似乎会阻塞较高优先级的线程?

热门标签

归档