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