【问题标题】:PriorityQueue sort is giving strange behavior on Ubuntu?PriorityQueue 排序在 Ubuntu 上给出了奇怪的行为?
【发布时间】:2013-10-26 04:31:08
【问题描述】:

我有 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.
   }  

我的 Request 类包含两个字段 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();
        }
        }
 }

而且我在每次使用对象输入/输出流的添加/轮询操作之后将此队列存储在文件中。在添加元素时,我首先读取存储的条目,然后添加新条目并再次将其存储回来。

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

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

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

【问题讨论】:

  • 与预期相比,什么代码给出了什么奇怪的结果?
  • 比较器代码,它给出了奇怪的结果。当我第一次尝试这段代码时,它工作正常,比较器根据计数参数正确排序了我的列表。但是下次当我删除所有类文件并再次重新编译相同的代码时,它根本没有执行排序。在您看来,这可能是一个愚蠢的问题,但它发生在我的 linux 系统上。不知道为什么?
  • 然后我在 Windows 7 上尝试了它,它工作正常并保持排序顺序。
  • 您没有显示相关代码:您执行什么代码?你希望它做什么,会发生什么?
  • 这并不能回答问题:您执行什么代码?你希望它做什么,会发生什么?

标签: java collections priority-queue


【解决方案1】:

您没有关闭 ObjectOutputStream。我希望您收到 StreamCorruptedException 或 EOFException 而不是您如此模糊描述的行为。或者您忽略了此类异常并继续执行您的代码。

【讨论】:

  • 太棒了..!!在正确关闭输入/输出流后工作。非常感谢。
  • 但是我想知道一件事,windows 7环境会自动执行所有这些事情吗?可能是linux没有。我对么?因为我的程序在 Windows 上运行时给出了正确的结果,即使我没有正确关闭这些流。
  • 如果发生这种情况,您的代码必须是一堆被忽略的异常,因此在 Windows 上也可能发生任何事情。
猜你喜欢
  • 1970-01-01
  • 2011-03-13
  • 2011-06-28
  • 2013-08-17
  • 2023-02-16
  • 2017-01-07
  • 2012-12-17
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多