如何在JAVA中创建高优先级有界子队列和低优先级有界子队列

Posted

技术标签:

【中文标题】如何在JAVA中创建高优先级有界子队列和低优先级有界子队列【英文标题】:How to create high priority bounded subqueue and low priority bounded subqueue in JAVA 【发布时间】:2015-11-19 16:40:11 【问题描述】:

我创建了一个优先级队列并用项目填充队列,并使用这个队列作为基础,我遍历它并找到项目的优先级。根据优先级,使用某些逻辑将项目移动到子队列。

在我的主程序中,我使用静态语句创建了有界子队列,我想做的是使用父队列构造函数的构造函数创建有界子队列:public HiLoPriorityQueue(int high_capacity, int low_capacity) 构造函数应该创建一个初始容量为 high_capacity 的高优先级有界子队列和一个容量为 low_capacity 的低优先级有界子队列

是否可以使用父队列上应用的相同添加和删除方法从父队列创建子队列??

我的主程序:

   public class PQTest 

    public static void main(String[] args) 

        HiLoPriorityQueue<Customer>  prq = new HiLoPriorityQueue<Customer>(10); 
        Customer c1 = new Customer("Rock",999);
        Customer c2 = new Customer("Brock",1);
        Customer c3 = new Customer("UnderTaker",1000);

        HiLoPriorityQueue<Customer>  hq = new HiLoPriorityQueue<Customer>(5);
        HiLoPriorityQueue<Customer>  lq = new HiLoPriorityQueue<Customer>(3);


        // insert values in the queue
        prq.add(c1);
        prq.add(c2);
        prq.add(c3);


        // create iterator from the queue
        Iterator it = prq.iterator();

        System.out.println ( "Priority queue values are: ");
        while (it.hasNext())
            Customer c = (Customer) it.next();
            System.out.println ( "Value: "+ c);
            System.out.println("Priority is :: "+c.getPriority());
            if(c.getPriority() == 1)
                if(hq.size() < 5 )
                    hq.add(c);
                else
                    if(hq.size() < 5 )  lq.add(c);
                    else
                        lq.remove();
                        lq.add(c);
                    
                
            
            else
                if(lq.size() < 3)   lq.add(c);
            
        

    


队列创建类:

public class HiLoPriorityQueue<E extends BinaryPrioritizable> extends AbstractCollection

private int count;
private Object[] elements;
private Object[] helements;
private Object[] lelements;
private int head;
private int tail;

public HiLoPriorityQueue(int high_capacity, int low_capacity)
    helements = new Object[high_capacity];
    lelements = new Object[low_capacity];
    count = 0;
    head = 0;
    tail = 0;       


public HiLoPriorityQueue(int capacity)

    elements = new Object[capacity];
    count = 0;
    head = 0;
    tail = 0;




@Override
public Iterator<E> iterator()
     
        return new Iterator<E>()
         
         public boolean hasNext()
         
         return visited < count;
         

         public E next()
         
         int index = (head + visited) % elements.length;
         E r = (E) elements[index];
         visited++;
         return r;
         

         public void remove()
         
         throw new UnsupportedOperationException();
         

         private int visited = 0;
     ;
     

 public boolean add(E anObject)
 
     elements[tail] = anObject;
     tail = (tail + 1) % elements.length;
     count++;
     return true;
 

 public E remove()
 
     E r = (E) elements[head];
     head = (head + 1) % elements.length;
     count--;
     return r;
  

@Override
 public int size()
 
    return count;
 




【问题讨论】:

"是否可以使用父队列上的相同添加和删除方法从父队列创建子队列??" - 这似乎是直截了当的。您是否尝试过并且遇到任何问题? public HiLoPriorityQueue(int high_capacity, int low_capacity) helements = new Object[high_capacity]; lelements = new Object[low_capacity]; hq = new HiLoPriorityQueue(high_capacity); lq = new HiLoPriorityQueue(low_capacity);计数 = 0;头 = 0;尾 = 0;这是我创建的构造函数,当我在我的逻辑中说 hq.add(c) 时,父队列会被添加,但子队列不会被添加:( 我明白了 - 但您没有创建 2 个子队列的代码。 此语句不会为父优先级队列“prq”创建子队列吗??------ hq = new HiLoPriorityQueue(high_capacity); 【参考方案1】:

您的代码毫无意义。为什么要使用 Object[] 数组将元素保存在 HiLoPriorityQueue 类中?使用Object 数组通常是一个坏主意,我认为根据您的类规范使用ArrayList&lt;E extends BinaryPrioritizable&gt; 会更有意义。其次,为什么你有helementslelements,因为它们从未被使用过?

是否可以使用父队列上应用的相同添加和删除方法从父队列创建子队列??

这个问题的答案是肯定的,因为您的父队列与您的子队列是同一类型。但是我不完全确定这是否是您要问的,我也不完全确定您要做什么。

但是,如果我对您的理解正确,我认为您正在尝试保持低优先级队列和高优先级队列。这些应该进入您的HiLoPriorityQueue 类,并在用户adds/removes 数据时在内部处理。您的优先级分离逻辑应该放在 HiLoPriorityQueue 类的 add() 方法中。

最后,如果您想要一个数据结构,以便在低优先级元素之前处理所有高优先级元素,您应该只使用内置的MaxHeap(即PirorityQueue&lt;Customer&gt; q = new PriorityQueue&lt;Customer&gt;())来指定比较器。

希望这会有所帮助。

【讨论】:

是的,你理解正确......我试图在 HiLoPriorityQueue 中保留一个低优先级队列和一个高优先级队列......会听从你的建议,我会尝试修改我的代码。谢谢。 我根据您的建议更新了我的代码,现在可以正常工作了。这是 git hub 中的更新代码github.com/kakarrot007/PriorityQueue....... 感谢大家的建议或反馈,以改进我的代码。 @Dex,看看你的代码。我认为您应该查看一些数据结构的实现,尤其是堆/队列,以了解它们是如何在下面实现的,以便更好地了解如何实现您的。我不确定您对编程/java 有多新以及您的代码是做什么用的(学习、构建某些应用程序等),但您的实现编码并不完全正确。

以上是关于如何在JAVA中创建高优先级有界子队列和低优先级有界子队列的主要内容,如果未能解决你的问题,请参考以下文章

java - 阻塞队列

Java里的阻塞队列

「每天一道面试题」Java中的阻塞队列都有哪些

如何在 Python 中创建唯一值优先级队列?

阻塞队列

Java 中的优先级队列,用于跟踪每个节点的位置