PriorityQueue排序在Ubuntu上给出了奇怪的行为?

时间:2013-10-26 04:31:09

标签: java collections priority-queue

我是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 idint 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();
        }
        }
 }

此外,我还在使用Object输入/输出流进行每次添加/轮询操作后将此队列存储在文件中。在添加元素时,我首先读取存储的条目,然后添加新条目并再次存储它。

约束是id应该是唯一的,对于两个或更多id,count可以相同/不同。 所以我正在对count参数执行排序,但是如果count相同,那么我应该得到排序顺序,使得较低的id应该在较高的id之前。

我最初在我的linux系统上尝试过这个程序,它正常工作并按照我的期望正确地给出了排序顺序。但后来我以某种方式删除了所有类文件,并创建了一个新文件进行存储,现在相同的代码(重新编译后)给了我完全奇怪的结果。它甚至不是基于计数参数的排序。为什么会这样?

然后我在我的Windows 7系统上尝试了相同的代码,它再次开始产生正确的结果。 为什么这么奇怪的行为? 请帮忙。感谢。

1 个答案:

答案 0 :(得分:0)

您没有关闭ObjectOutputStream。我希望你得到StreamCorruptedException或EOFException,而不是你模糊描述的行为。或者您忽略了这些异常并继续使用您的代码。