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

标签 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.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;
 }

我也在努力使用最终的 toString 方法,为了以给定格式将队列返回为字符串,我尝试了使用 StringBuilder 的方法,但这无法正确编译。或者,我可以使用普通的 for 循环来实现它,但我再次在精确的语法上苦苦挣扎。

我在网上找到了使用堆结构(我还没有)和一个我无法理解的名为 Comparator 的类来构建这个 PQ 的资源。任何帮助将不胜感激!

我主要是在挣扎

public PriorityQueue(){
      //what code?}

功能。我该如何在这里创建一个"new"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;
}

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

关于java - 如何在不使用Java类的情况下实现PriorityQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716800/

相关文章:

java - 在小于线性时间内从最小-最大队列类中删除最小和最大

java.lang.ClassNotFoundException : com. csvreader.CsvReader

c# - 声明一个不能实例化的类有哪些方式?

c++ - 在主函数 c++ 中使用类时出现两个错误

python - 类实例变量继承和类变量继承

python - OutOfRangeError(请参阅上面的回溯): FIFOQueue '_1_batch/fifo_queue' is closed and has insufficient elements (requested 32, 当前大小 0)

java - 构建最可靠的用户国机制

java - 定位用户当前位置并在 Google map 中显示

java - 在运行时切换键盘快捷键集

Java:使用泛型类创建整数数组的数组