如何在不使用Java类的情况下实现PriorityQueue?

如何在不使用Java类的情况下实现PriorityQueue?,java,class,queue,priority-queue,Java,Class,Queue,Priority Queue,我试图在不使用Java提供的PriorityQueue类的情况下创建PriorityQueue。为此,我必须填写一些给定的方法。我不确定我在哪里犯了错误。似乎我的put和get函数都是错误的,我不确定如何按照代码中给出的那样创建新的PQ。我所拥有的是: class Element { private int priority; private String data; Element(int priority, String data) { // Ihr Code this

我试图在不使用Java提供的PriorityQueue类的情况下创建PriorityQueue。为此,我必须填写一些给定的方法。我不确定我在哪里犯了错误。似乎我的put和get函数都是错误的,我不确定如何按照代码中给出的那样创建新的PQ。我所拥有的是:

class Element {

private int priority;
private String data;

Element(int priority, String data) { 
    // Ihr Code
    this.priority = priority;
    this.data = data;

 }

public String getData() { 
    // Ihr Code
    return data;
}


public int getPriority() { 
    // Ihr Code
    return priority;
 }

/**
 * Return data and priority as string 
 * Format: Data (Priority)
 * e.g: abc (7)
 */
public String toString()        {
    String str = data + " " + Integer.toString(priority) + ")";  
    return str;
}
}


public class PriorityQueue {


static final int SIZE = 32;


private Element[] data = null;

// actual number of entries
private int len = 0;


/**
 * Creates a new PriorityQueue
 */
public PriorityQueue() {
    // Ihr Code      
}

/** 
 * Adds a new element into the queue as long as there is space
 * Returns true if element could be added, otherwise false 
 */
boolean put(Element element) {
    // Ihr Code
    if(len == SIZE){
        return false;
    }else{
        int i = len-1;
        while (i>=0 && element.getPriority() > data[i].getPriority()){
            data[i+1] = data[i];
            i--;
        }
        data[i+1] = element;
        len++;
        return true;
    }

}

/**
 * Returns element with the highest priority 
 * and removes it from the queue. Otherwise returns null
 * 
 */
Element get() {
    // Ihr Code
    if (len > 0){
        Element x = q[0];
        for(int i = 1; i < len; i++){
            data[i-1] = data[i];
        }
        len--;
        return x;
        }else{
             return null;
        }
    }

/**
 * Number of entries 
 */
int length() {
    // Ihr Code
    return len;
 }

/**
 * Returns contents of the queue as a String
 * Format: data1 (priority1), data2 (priority2)
 * e.g: abc (7), cde (8)
 * Attention: There should be no comma at the end of the String 
 */
public String toString() {
    //  Code
    String res = new String();
    //res = "(" + data + "," + ")";

    if(data.length>0){
        StringBuilder sb = new StringBuilder();

        for(String s: data){
            sb.append(s).append(",");
        }
        res = sb.deleteCharAt(sb.length()-1).toString;
    }

    return res;
 }
功能。我应该如何在这里制作“新”PQ?应该是吗

PriorityQueue pq = new PriorityQueue(); 

我完全迷路了!非常感谢你的帮助

您的
PriorityQueue
构造函数必须初始化数组并设置当前项数。即:

public PriorityQueue() {
    data = /* initialize array */
    len = 0;
}
您真的不需要让队列中的元素保持有序。只需使用
put
方法将该项添加为数组中的下一个元素:

public put(Element e) {
    if (len == SIZE) {
        return false;
    }
    data[len++] = e;
    return true;
}
然后,您的
get
方法在数组中搜索最高优先级的项,保存它,用数组末尾的项替换它,并返回:

Element get() {
    if (len == 0) {
        return null;
    }
    int p = 0;
    for (int i = 1; i < len; ++i) {
        if (data[i].getPriority() < data[p].getPriority()]) {
            p = i;
        }
    }
    Element e = data[p];
    // replace with the last item
    data[p] = data[len-1];
    --len;
    return e;
}
元素get(){
如果(len==0){
返回null;
}
int p=0;
对于(int i=1;i

因此,
put
是一个O(1)操作,
get
是O(n)。在您的代码中,两者都是O(n)。

您的
PriorityQueue
构造函数必须初始化数组并设置当前项数。即:

public PriorityQueue() {
    data = /* initialize array */
    len = 0;
}
您真的不需要让队列中的元素保持有序。只需使用
put
方法将该项添加为数组中的下一个元素:

public put(Element e) {
    if (len == SIZE) {
        return false;
    }
    data[len++] = e;
    return true;
}
然后,您的
get
方法在数组中搜索最高优先级的项,保存它,用数组末尾的项替换它,并返回:

Element get() {
    if (len == 0) {
        return null;
    }
    int p = 0;
    for (int i = 1; i < len; ++i) {
        if (data[i].getPriority() < data[p].getPriority()]) {
            p = i;
        }
    }
    Element e = data[p];
    // replace with the last item
    data[p] = data[len-1];
    --len;
    return e;
}
元素get(){
如果(len==0){
返回null;
}
int p=0;
对于(int i=1;i

因此,
put
是一个O(1)操作,
get
是O(n)。在代码中,两者都是O(n)。

构造函数只需初始化
元素[]

public PriorityQueue(){
数据=新元素[大小];
}
现在转到
put()
。此方法将在
while
循环中抛出
BoundsException数组,因为您从
i=len-1
开始,它是
数据的最后一个字段。然后访问不存在的
数据[i+1]
,将抛出异常(当然,除非您使用
数据=新元素[SIZE+1]
对其进行初始化)

解决方案:只需使用
i
i-1
即可:

boolean put(元素){
if(len==大小){
返回false;
}否则{
//编辑:我将I=len-1更改为I=len,因为,否则,
//最后一个元素将始终被覆盖
//最后一个元素被复制到第一个“free”元素,然后
//等等。
i=len;
而(i>0&&element.getPriority()>数据[i-1].getPriority()){
数据[i]=数据[i-1];
我--;
}
数据[i]=元素;
len++;
返回true;
}
}
EDIT:我之前说过,将返回优先级最低的元素。事实上,这是最伟大的

get()
方法的行为与预期的一样(除了它应该在开头说
Element x=data[0]
而不是
q[0]
)。它返回数组的第一个元素(具有最大
getPriority()
值的元素),并向下移动剩余的一个索引。但是,如果希望返回值最小的元素,只需在codeput()的codewile/code循环中将
切换到
0&&element.getPriority()
最后但并非最不重要的是
toString()
方法。除了for-each循环外,它看起来基本正确。这个函数总是在整个数组中进行迭代,其中它最多只能迭代
数据[len-1]
。因此,只需使用索引,您就可以:

公共字符串toString(){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i0){
sb.deleteCharAt(sb.length()-1);
}
使某人返回字符串();
}
或者,如果您至少安装了Java 8,则可以将streams用于此方法:

公共字符串toString(){
返回数组.asList(data).stream()
.限制(len)
.map(元素::toString)
.collect(收集器。连接(“,”);
}

构造函数只需初始化
元素[]

public PriorityQueue(){
数据=新元素[大小];
}
现在转到
put()
。此方法将在
while
循环中抛出
BoundsException数组,因为您从
i=len-1
开始,它是
数据的最后一个字段。然后访问不存在的
数据[i+1]
,将抛出异常(当然,除非您使用
数据=新元素[SIZE+1]
对其进行初始化)

解决方案:只需使用
i
i-1
即可:

boolean put(元素){
if(len==大小){
返回false;
}否则{
//编辑:我将I=len-1更改为I=len,因为,否则,
//最后一个元素将始终被覆盖
//最后一个元素被复制到第一个“free”元素,然后