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

Java PriorityQueue排序在Ubuntu上给出了奇怪的行为?,java,collections,priority-queue,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(

我上过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.
   }  
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();
        }
        }
 }
类QStorage{
Queue readReqQ=new PriorityQueue(7,new SortRequest());
公共队列readRequestQ(){
试一试{
FileInputStream fin=newfileinputstream(“/home/winn/requestQ.ser”);
ObjectInputStream ois=新ObjectInputStream(fin);
readReqQ=(队列)ois.readObject();
}
捕获(例外e){
返回null;
}
返回readReqQ;
}
公共无效writeRequestQ(队列rq){
队列请求q=rq;
试一试{
FileOutputStream fos=新的FileOutputStream(“/home/winn/requestQ.ser”);
ObjectOutputStream oos=新的ObjectOutputStream(fos);
oos.writeObject(requestQ);
系统输出打印项次(“完成”);
}捕获(例外e){
e、 printStackTrace();
}
}
}
而且,在每次使用对象输入/输出流进行添加/轮询操作之后,我都将该队列存储在文件中。在添加元素时,我首先读取存储的条目,然后添加新条目,然后再将其存储回来

约束条件是id应该是唯一的,两个或多个id的计数可以相同/不同。 所以我对count参数执行排序,但如果count相同,那么我应该获得排序顺序,以便较低的id应该优先于较高的id

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

然后我在我的Windows7系统上尝试了同样的代码,它再次开始产生正确的结果。 为什么会有如此奇怪的行为?
请帮忙。谢谢。

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

什么代码给出了什么奇怪的结果,与什么期望相比?比较器代码,它给出了奇怪的结果。当我第一次尝试这段代码时,它工作正常,comparator根据count参数对我的列表进行了正确排序。但下一次当我删除所有类文件并重新编译相同的代码时,根本不执行排序。在您看来,这可能是一个愚蠢的问题,但在我的linux系统中却发生了这种情况。我不知道为什么?然后我在windows 7上试用了它,它工作正常,并且维护排序顺序。你没有显示相关代码:你执行什么代码?你期望它做什么,会发生什么?这并没有回答问题:你执行什么代码?你期望它做什么,会发生什么?太好了。。!!在正确关闭输入/输出流后工作。非常感谢。但我想知道一件事,windows 7环境是否自动执行所有这些操作?也许linux没有。我说得对吗?因为我的程序在windows上运行时给出了正确的结果,即使我没有正确关闭这些流。如果发生这种情况,您的代码一定是一堆被忽略的异常,因此windows上也可能发生任何事情。
 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();
        }
        }
 }