我的任务是在Java中编写我自己的PriorityQueue类。它基于LinkedList。引用说明:
存储在节点中的数据类型应该是可比较的通用类型。这是为类声明编写的:public class PriorityQueue(E)-
我将使用PriorityQueue来编写另外两个类,一个是患者类型的,另一个是waitingRoom类型的。这就是比较方法发挥作用的地方,因为我将这两个类排序为它们各自的PriorityQueue。
我一直在PriorityQueue类内部定义ListNode类,所以我在一个类中有一个类。现在问题来了:
我将在哪里实现/重写从Comparable继承的compareTo方法?
它无法在PriorityQueue类中实现,因为compareTo只能接受一个参数。然而,这似乎是它应该去的地方,因为这是实际的类。
如果我在ListNode类中实现它,我不知道该如何实现。我要把ListNode变成一个接口吗?抽象课堂?
下面是我写的相当新手的代码谢谢帮助
package hostpitalQueue;
import java.util.AbstractList;
public class PriorityQueue<E extends Comparable<E>> {
private ListNode front;
public PriorityQueue() {
front = null;
}
public PriorityQueue(ListNode n1) {
front = n1;
}
//method for addingNode to beginning,
//perhaps overload method for next nodes?
public void addNode(ListNode n1) {
if(front == null) {
front = n1;
}else {
//need to find last node and add n1 to it
ListNode lastNode = findLastNode(n1);
lastNode.addNode(n1);
}
}
//need to compare, remember, this is a priorityqueue
public ListNode findLastNode(ListNode n) {
//compare the data of both
//compare to front
ListNode n1 = front;
int i = n1.compareTo(n);
//only do something here if n is higher priority
if(i > 0) {
E frontData = n1.data;
E nodesData = n.data;
ListNode holder = n1;
front = n;
n.next = holder;
holder.previous = n;
}else if(n1.next == null) {
n1.next = n;
n.previous = n1;
}
else {
while(front.next != null) {
n1 = front.next;
//is n1 a higher priority?
Integer ii = n1.compareTo(n);
if(ii > 0) {
//this means that we should return the previous node, to insert
//before this one
return n1.previous;
}
}
}
return n1;
}
public class ListNode {
//contains a left and a right, as well as a data field
public E data;
public ListNode previous,next;
//construct
public ListNode() {
data = null;
previous = null;
next = null;
}
//previous to next
public ListNode(E data) {
this.data = data;
previous = null;
next = null;
}
public ListNode(E data,ListNode n1) {
this.data = data;
previous = n1;
next = null;
}
public ListNode(E data,ListNode n1,ListNode n2) {
this.data = data;
previous = n1;
next = n2;
}
public void addNode(ListNode n1) {
//gotta check if my next is null
ListNode holder = null;
if(this.next != null) {
holder = this.next;
}
this.next = n1;
n1.previous = this;
n1.next = holder;
}
public int compareTo(ListNode n1) {
return 0;
}
public void printMe() {
System.out.println(this.data);
}
}
}
如果要比较两个ListNodes,如第行所示:
n1.compareTo(n)
您需要使其实现可比性:
public class ListNode implements Comparable<ListNode> {
并实现compareTo
方法,如下所示:
return this.data.compareTo(that.data);
(因为您知道数据
是可比的
)。但您必须处理空数据的情况。
请注意,您还应该将顶级类上的类型变量声明为:
<E extends Comparable<? super E>>
将用作PriorityQueue
元素类型的每个类都必须实现Comparable
接口和compareTo
方法。
请注意,由于您的ListNode
类实现了compareTo
方法,您可以让它实现Comparable
public class ListNode implements Comparable<ListNode> {
...
@Override
public int compareTo(ListNode n1) {
return data.compareTo(n1.data);
}
请注意,由于
ListNode
classe不依赖于PriorityQueue
的实例,因此可以将其设置为static
;在这种情况下,您必须声明一个通用参数:
public static class ListNode<T extends Comparable<T>>
implements Comparable<ListNode<T>> {
//contains a left and a right, as well as a data field
public T data;
public ListNode<T> previous,next;
//construct
public ListNode() {
data = null;
previous = null;
next = null;
}
//previous to next
public ListNode(T data) {
this.data = data;
previous = null;
next = null;
}
public ListNode(T data,ListNode<T> n1) {
this.data = data;
previous = n1;
next = null;
}
public ListNode(T data,ListNode<T> n1,ListNode<T> n2) {
this.data = data;
previous = n1;
next = n2;
}
public void addNode(ListNode<T> n1) {
//gotta check if my next is null
ListNode<T> holder = null;
if(this.next != null) {
holder = this.next;
}
this.next = n1;
n1.previous = this;
n1.next = holder;
}
@Override
public int compareTo(ListNode<T> n1) {
return data.compareTo(n1.data);
}
public void printMe() {
System.out.println(this.data);
}
}
类
ListNode
有字段,所以不能将其更改为接口(为什么要这么做?)
你或许应该问问自己,你是否真的需要一个双链接列表,而单链接列表是不够的。
您的问题中不清楚您是否需要实现一个链表,或者您是否可以使用类
LinkedList
,在这种情况下,您不需要ListNode
类:PriorityQueue
只会封装一个LinkedList
问题内容: 我正在学习Java,并且希望将自己的课堂变成可观察的课堂。 但是我已经有了它扩展了另一个类。 我该怎么办? 问题答案: 我建议避免完全使用该类,而应 定义事件特定的侦听器和相应的事件定义 。然后在您的类中定义一个侦听器列表,以及添加和删除侦听器以及向其传播事件的方法(请参见下文)。 强制您使用它来表示事件,然后使用来检查事件类型,这是一种丑陋的非OO方法,并使代码更难以理解。如果查看j
问题内容: 因此,可以说我正在尝试使用从类中获取方法。 但是该类正在扩展另一类,即带有方法的类。我不太确定这是否会使它抛出异常。 我知道正在扩展的类具有getFile方法。对不起,如果我听起来混乱,有点累。 问题答案: 听起来您只需要使用而不是即可。整个要点是,它 仅 查找在您要对其调用的类中声明的方法: 返回一个Method对象,该对象反映此Class对象表示的类或接口的指定声明方法。 鉴于:
我被要求创建一个主方法,允许我创建一个狼对象、鹦鹉对象和犀牛对象,我已经为这些动物中的每一个创建了类,他们扩展了抽象类动物,其中包含一个抽象方法makeNoise()。我已经在我的犀牛、鹦鹉和狼类中实现了这个抽象方法,该方法包含一个System.out.println函数和与这些动物中的每一个相关的噪声。例如,我的鹦鹉类(扩展动物)包含一个方法makeNoise(),它打印出“Squawk”。 我
我是OOPs新手,如果这听起来很基本,我很抱歉。我有一个具有以下代码的类:- 现在假设我在同一个包中有另一个类“Main”。有什么方法我可以创建一个类的对象'内部'在'主'与类'外部'参考? 我尝试了以下操作(这是抛出错误):- “Main”和“Outer”类都在同一个包中。另外,我的主要目标是了解是否有任何方法可以在main方法中创建类Inner的对象,如下所示:-outerO1=newinne
该类包含: > 一个无参数构造函数,用于创建具有指定边1、边2和边3的三角形。 所有三个数据字段的访问器方法。 名为getArea()的方法,该方法返回此三角形的区域。 一个名为GetPermission()的方法,返回此三角形的周长。 *一个名为toString()的方法,返回三角形的字符串描述。 有关计算三角形面积的公式,请参见编程练习2.15(java编程入门第9版)。toString()方
使用java和testNG,我在两个不同的类test1.class和test2.class中有两个测试,还有一个包含大多数方法的base.class: