2013-10-26 6 views
0

Я MyQ классСортировка PriorityQueue дает странное поведение на Ubuntu?

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 вместе с сеттеров и добытчиками.

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

А также я храню эту очередь в файле после каждого добавления/операции опроса с использованием Поток ввода/вывода объекта. Добавляя элемент, я сначала читаю сохраненные записи, а затем добавляю новую запись и снова сохраняю ее.

Ограничение: идентификатор должен быть уникальным, счетчик может быть одинаковым/различным для двух или более идентификаторов. Итак, я выполняю сортировку по параметру count, но в случае, если count такой же, я должен получить порядок сортировки таким образом, чтобы нижний идентификатор должен предшествовать более высокому.

Сначала я попробовал эту программу на своей системе Linux, где она работала правильно и правильно выдавала порядок сортировки в соответствии с моими ожиданиями. Но потом каким-то образом я удалил все файлы классов, а также создал новый файл для хранения, а теперь тот же код (после перекомпиляции) дал мне совершенно странные результаты. Его даже не сортировка на основе параметра count. Почему это так?

Затем я попробовал тот же код в моей системе Windows 7, его снова начали производить правильные результаты. Почему такое странное поведение? Пожалуйста, помогите. Благодарю.

+0

Какой код дает какие-то странные результаты, по сравнению с ожиданиями? – EJP

+0

Код компаратора, дающий странные результаты. Когда я впервые пробовал этот код, он работал правильно, и компаратор сортировал мой список должным образом в соответствии с параметром count. Но в следующий раз, когда я удалил все файлы классов и повторно скомпилировал один и тот же код, он не выполняет сортировку. Это может показаться вам глупой проблемой, но это происходит с моей Linux-системой. Я не знаю почему? – Winn

+0

Я тогда пробовал это на Windows 7, работая правильно и поддерживая порядок сортировки. – Winn

ответ

0

Вы не закрываете ObjectOutputStream. Я ожидаю, что вы получите исключение StreamCorruptedException или EOFException, а не поведение, которое вы так неопределенно описываете. Или что вы игнорируете такие исключения и продолжаете свой код в любом случае.

+0

Great .. !! работал после правильного закрытия потоков ввода/вывода. Большое спасибо. – Winn

+0

Но я хочу знать одно: среда Windows 7 выполняет все эти функции автоматически? Может быть, Linux не работает. Я прав? Потому что моя программа давала правильные результаты при работе в окнах, даже когда я не закрывал эти потоки должным образом. – Winn

+0

Ваш код должен быть путаницей игнорируемых исключений для всех, если это произошло, поэтому что-то могло случиться и в Windows. – EJP

Смежные вопросы