java优先级队列排序在Ubuntu上给出了奇怪的行为?
我上过MyQ课
class MyQ{
Queue<Request> q = new PriorityQueue<Request>(7, new SortRequest());
QueueStorage qStorage = new QueueStorage();
public void addRequest(int siteId, int timeStamp){
try{
q = qStorage.readRequestQ();
q.add(new Request(sId, tStamp));
qStorage.writeRequestQ(q);
}catch(Exception e){
e.printStackTrace();
}
//similarly deleteRequest() and showRequest() method follows.
}
我的请求类包含两个字段int id
和int count
,以及setter和getter
SortRequest类是这样的:
class SortRequest implements Comparator<Request>, Serializable{
public int compare(Request r1, Request r2) {
if(r1.getCount()!=r2.getCount())
return new Integer(r1.getCount()).compareTo(r2.getCount());
if(r1.getId()!=r2.getId())
return new Integer(r1.getId()).compareTo(r2.getId());
return 0;
}
}
QStorage类类似于:
class QStorage{
Queue<Request> readReqQ = new PriorityQueue<Request>(7, new SortRequest());
public Queue<Request> readRequestQ() {
try{
FileInputStream fin = new FileInputStream("/home/winn/requestQ.ser");
ObjectInputStream ois = new ObjectInputStream(fin);
readReqQ = (Queue)ois.readObject();
}
catch(Exception e){
return null;
}
return readReqQ;
}
public void writeRequestQ(Queue<Request> rq){
Queue<Request> requestQ = rq;
try{
FileOutputStream fos = new FileOutputStream("/home/winn/requestQ.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(requestQ);
System.out.println("done");
}catch(Exception e){
e.printStackTrace();
}
}
}
而且,在每次使用对象输入/输出流进行添加/轮询操作之后,我都将该队列存储在文件中。在添加元素时,我首先读取存储的条目,然后添加新条目,然后再将其存储回来
约束条件是id应该是唯一的,两个或多个id的计数可以相同/不同。 所以我对count参数执行排序,但如果count相同,那么我应该获得排序顺序,以便较低的id应该优先于较高的id
我最初在我的linux系统上尝试了这个程序,它工作正常,按照我的期望正确地给出了排序顺序。但后来不知何故,我删除了所有类文件,并创建了一个新的存储文件,现在相同的代码(重新编译后)给了我完全奇怪的结果。它不是基于计数参数的均匀排序。为什么会这样
然后我在我的Windows7系统上尝试了同样的代码,它再次开始产生正确的结果。 为什么会有如此奇怪的行为? 请帮忙。谢谢
# 1 楼答案
您没有关闭ObjectOutputStream。我希望你得到的是StreamCorruptedException或EOFEException,而不是你如此模糊地描述的行为。或者你忽略了这样的异常并继续你的代码