我编写的程序将患者添加到链表中。现在我能够得到输出。我调整了我的代码,以便根据严重程度从最高到最低插入患者,如果严重程度相同,则根据时间。我的患者类有三个属性名称,到达和严重程度。
编辑3
我在compareSeverity
课程中添加了Patient
方法。
public boolean compareSeverity(Patient other) {
boolean result = false;
if(other.severity > severity) {
result = true;
} else if(other.severity == severity) {
if(other.arrival > arrival) {
result = true;
} else {
result = false;
}
} else {
result = false;
}
return result;
}
这是PatientNode
代码段。
class PatientNode {
public Patient data;
public PatientNode next;
public PatientNode(Patient data, PatientNode next) {
this.data = data;
this.next = next;
}
}
这是add
类中的linked list
方法。
public void add(String name, int severity) {
lastArrival++;
Patient patient = new Patient(name, lastArrival, severity);
PatientNode current, previous;
current = head;
previous = null;
if(head == null) {
head = current = new PatientNode(patient, head);
size++;
} else {
while(current!=null) {
//previous = current;
if(current.data.compareSeverity(patient)) {
PatientNode n = new PatientNode(patient,current);
size++;
n.next = current;
if(previous==null) {
head = n;
} else {
previous.next = n;
}
return;
}
previous = current;
current = current.next;
}
}
}
我现在得到的输出是这个,但问题似乎与相同的 severity
患者有关。
我希望我的输出看起来像这样:
患者1,到达2,严重程度3
患者2,到达3,严重程度3
或者如果他们有不同的严重性,那么就像这样:
患者1,到达2,严重程度2
患者2,到达1,严重程度1
简而言之severity
必须按降序排列,如果严重程度相同,则根据arrival
按升序存储它们。
任何想法/指针或我可以根据严重程度存储患者的一些伪代码都会非常棒,谢谢。
答案 0 :(得分:1)
你的while循环中有错误!
在LinkedList中更改内容时要刻意:确保更改正确的节点。假设您的情况是当前列表
node1 --> node2 --> node4 --> node5
我们有一个PatientNode
node3
,必须在node4
之前的列表中插入,如下所示:
node1 --> node2 --> **node3** --> node4 --> node5
我们必须更改的内容只是next
的{{1}}字段必须为node2
,而node3
字段为next
字段}本身(必须是node3
)
如果我们查看您的代码,那么在while循环中,您有节点node4
和n
,分别是必须添加的新节点和迭代期间的当前节点。在循环中,您需要验证p
是否必须在n
之前,以及必须时,您执行此操作:
p
这是错的!将其与示例中的n.next = p.next;
p.next = n;
和node3
进行比较:node4
必须在n
之前,因为p
必须在node3
之前。因此node4
对应n
,p对应node3
。 您只需要更改node4
(对应于next
)和p
节点的父级的node2
字段。您不需要触摸n
。要解决此问题,您可以简单地更改while循环中的if语句:将p
更改为p.data
。
您在循环中遇到的另一个错误是,您没有在添加患者的地方休息,因为它的p.next.data
更高。但我建议您尽可能减少arrival
秒的使用时间。在设置break
- 变量时,请在循环条件中使用其值:added
这是一个更好的建议:使用正确的while(p.next!=null && !added){
- 条件,而不是仅使用else if
作为if
中if
内唯一的内容else
1}} - 子句
这也是一个建议。我会强烈推断LinkedList,其中最后一个节点保留指向第一个节点(head
)的指针。特别是在这里,因为如果next
发生变化,则没有代码可以更新最后一个元素的head
值。这可能会产生非常奇怪的结果(因为最后一个元素指向第二个元素而不是第一个元素)并且如果没有足够的注意力会导致不同的错误(特别是在递归的情况下堆栈溢出错误)
所以最后你的add
- 函数看起来应该是这样的:
public void add(String name, int severity) {
Patient patient;
lastArrival++;
patient = new Patient(name, lastArrival, severity);
PatientNode n = new PatientNode(patient, null);
if(head==null) {
head = n;
size++;
return;
} else if(n.data.getSeverity() > head.data.getSeverity()) {
n.next = head;
size++;
head = n;
return;
}
PatientNode p = head;
boolean added = false;
while(p.next!=null && !added) {
if(p.next.data.getSeverity() < severity) {
n.next = p.next;
p.next = n;
added = true;
} else if(p.next.data.getSeverity()== severity && p.next.data.getArrival() > lastArrival) {
n.next = p.next;
p.next = n;
added = true;
}
p=p.next;
}
if(!added) {
p.next = n;
}
size++;
}
我在每种情况下都放回了size++
。
我使用我提出的更正复制了您的代码并生成了minimal working code。我使用您发布的方法创建了包含最小字段(head
,size
,lastArrival
和仅add
函数)和类Patient
的类LinkedPatients 3个字段(name
,arrival
,severity
)。我尝试在你发布的第一个输出中重新创建你的三个场景(看起来你有一种remove
方法,但你没有发布它所以最后一个案例并不完全相同)。您可以点击链接并检查输出。
答案 1 :(得分:0)
使用compareSeverity进行代码更新后:
条件if(other.arrival > arrival) {
应该是if(other.arrival < arrival) {
,而if
- 条款可以在compareSeverity
方法中简化,因为您只需要指定何时需要设置true
上的值,而不是使用。
false
public boolean compareSeverity(Patient other) {
boolean result = false;
if((other.severity > severity) || (other.severity == severity && other.arrival < arrival)) {
result = true;
}
return result;
}
因为它只是设置一个布尔值,你甚至可以让它成为:
public boolean compareSeverity(Patient other) {
return (other.severity > severity) || (other.severity == severity && other.arrival < arrival);
}
您在while循环后忘记了add
方法中的if条件。如果current
成为null
该怎么办?如果您无法将患者插入链接列表中,则必须将其作为最后一个元素放在后面。
public void add(String name, int severity) {
lastArrival++;
Patient patient = new Patient(name, lastArrival, severity);
if(head == null) {
head = new PatientNode(patient, head);
size++;
} else {
PatientNode current, previous;
current = head;
previous = null;
while(current!=null) {
if(current.data.compareSeverity(patient)) {
PatientNode n = new PatientNode(patient,current);
size++;
//n.next = current; // overkill
if(previous==null) {
head = n;
} else {
previous.next = n;
}
return;
}
previous = current;
current = current.next;
}
if(current == null){
previous.next = new PatientNode(patient, null);
size++;
}
}
}
我可以为您提供a working example更新后的代码