gpt4 book ai didi

java - 实现 PriorityQueue 协助

转载 作者:行者123 更新时间:2023-12-02 05:37:51 25 4
gpt4 key购买 nike

这里是典型的学生,正在为作业的最后步骤寻求一些意见。非常感谢任何为我指明正确方向的帮助或提示。

我们的部分任务是实现急诊室优先队列。我卡住的部分的详细信息如下:

Write a class called PatientQueue with:

a. A default, no-arg constructor

b. Two public methods:
i. public void registerPatient(Patient p)
ii. public Patient getNextPatient()

c. Internal use of a PriorityQueue and PatientComparator

这是我到目前为止所拥有的:

在 Patient.java 中:

package blah;

import java.util.Date;

public class Patient {

// data fields
protected String name;
protected int category;
protected Date timeArrived;

// accessors and mutators
public String getName() {
return name;
}
public void setName(String nameIn) {
this.name = nameIn;
}
public int getCategory() {
return category;
}
public void setCategory(int categoryIn) {
this.category = categoryIn;
}

public java.util.Date getTimeArrived() {
return timeArrived;
}

// default constructor
public Patient() {
this.name = "Default Name";
this.category = 5; // unclassified Patients go to the end of the queue
this.timeArrived = new Date();
}

// overloaded constructor
public Patient(String nameIn, int categoryIn) {
this.name = nameIn;
this.category = categoryIn;
this.timeArrived = new Date();
}

} // end Patient class

在 PatientComparator.java 中:

package blah;

import java.util.Comparator;

public class PatientComparator implements Comparator<Patient> {

public int compare(Patient p1, Patient p2) {
if (p1.getCategory() < p2.getCategory())
return -1;
if (p1.getCategory() > p2.getCategory())
return 1;
else { if (p1.getTimeArrived().before(p2.getTimeArrived()))
return -1;
if (p1.getTimeArrived().after(p2.getTimeArrived()))
return 1;
}
return 0;
}

} // end PatientComparator class

在 PatientQueue.java 中:

package blah;

import java.util.Comparator;
import java.util.PriorityQueue;

public class PatientQueue extends PriorityQueue<Patient> {

// default constructor
public PatientQueue() {

}

public void registerPatient(Patient p) {
//NEED HELP IN THIS PART//
} // end registerPatient method

public Patient getNextPatient() {
return (Patient)this.poll();
} // end getNextPatient method

} // end PatientQueue class

最后,在驱动程序 EmergencyRoomSimulator.java 中: 包废话;

import java.util.Random; 

public class EmergencyRoomSimulator {

private static final int WAIT_LIMIT = 3000; // 1000 = 1 second

private PatientQueue pq = new PatientQueue();

private void t() {
try { Thread.sleep(new Random().nextInt(WAIT_LIMIT));
} catch (InterruptedException e) {
}
} // end t method

private void patientArrives(Patient p) {
pq.registerPatient(p);
System.out.println(" ARRIVAL: " + p.getName());
System.out.println(" time arrived: " + p.getTimeArrived());
System.out.println(" category: " + p.getCategory());
System.out.println("------------------------------------");
t();
} // end patientArrives method

private void doctorVisits() {
Patient p = pq.getNextPatient();
System.out.println(" VISIT: " + p.getName());
System.out.println(" time arrived: " + p.getTimeArrived());
System.out.println(" category: " + p.getCategory());
System.out.println("------------------------------------");
t();
} // end doctorVisits method

private void simulate() {
System.out.println("------------------------------------");
System.out.println("ER OPEN");
System.out.println("------------------------------------");
patientArrives(new Patient("John Paul Jones", 3));
patientArrives(new Patient("Thomas Paine", 1));
patientArrives(new Patient("Joseph Brant", 2));
doctorVisits();
patientArrives(new Patient("Ethan Allen", 2));
patientArrives(new Patient("Henry Knox", 4));
patientArrives(new Patient("Patrick Henry", 2));
doctorVisits();
doctorVisits();
patientArrives(new Patient("Mary Draper", 1));
patientArrives(new Patient("Samuel Adams", 3));
doctorVisits();
doctorVisits();
doctorVisits();
doctorVisits();
doctorVisits();
System.out.println("------------------------------------");
System.out.println("ER CLOSED");
System.out.println("------------------------------------");
} // end simulate method

public static void main(String[] args) {
EmergencyRoomSimulator er = new EmergencyRoomSimulator();
er.simulate();
} // end main

} // end class

我收到的错误是:

Exception in thread "main" java.lang.NullPointerException

在 main 中的第一个 doctorVisits() 调用上。我知道我缺少在列表中实际添加和/或删除对象的正确方法,但我看不到 PatientQueue 类中需要发生什么才能实际触发 PriorityQueue 用于添加或“获取”下一个患者。

再次,非常感谢任何建议。谢谢!

最佳答案

我什至不会制作一个单独的比较器。您只需在 Patient 类上实现 Comparable 接口(interface)并实现必要的compareTo 方法即可。快速实现:

@Override
public int compareTo(Object o) {
Patient p = (Patient) o;
if (this.getCategory() < p.getCategory())
return -1;
if (this.getCategory() > p.getCategory())
return 1;
else { if (this.getTimeArrived().before(p.getTimeArrived()))
return -1;
if (this.getTimeArrived().after(p.getTimeArrived()))
return 1;
}
return 0;
}

同时在您的 registerPatient 方法中添加 this.add(p)

不需要其他任何东西就可以让程序运行。有关可比接口(interface)的更多信息:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

<小时/>

编辑//

在您发表评论后,我更仔细地查看了作业,实际上它说:

c. Internal use of a PriorityQueue and PatientComparator

这意味着(至少我是这样理解的)您实际上不必扩展 PriorityQueue,但您可以将其用作内部资源。以下是我实现 PatientQueue 类的方法:

import java.util.Comparator;
import java.util.PriorityQueue;

public class PatientQueue {
PriorityQueue pq;

// default constructor
public PatientQueue() {
this.pq = new PriorityQueue<Patient>(1, new PatientComparator());
}

public void registerPatient(Patient p) {
this.pq.add(p);
} // end registerPatient method

public Patient getNextPatient() {
return (Patient) this.pq.poll();
} // end getNextPatient method

} // end PatientQueue class

并且在您的 EmergencyRoomSimulator 类中只需将字段声明更改为

PatientQueue pq = new PatientQueue();

关于java - 实现 PriorityQueue 协助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24810287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com