私は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 id
2つのフィールドが含まれています。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();
}
}
}
また、オブジェクトの入出力ストリームを使用して追加/ポーリング操作を行うたびに、このキューをファイルに保存しています。要素を追加している間、最初に保存されたエントリを読み取り、次に新しいエントリを追加して、再度保存します。
ID は一意である必要があり、2 つ以上の ID の数は同じでも異なっていてもかまいません。そのため、count パラメータで並べ替えを実行していますが、count が同じ場合は、低い ID が高い ID に先行するように並べ替え順序を取得する必要があります。
最初にこのプログラムを Linux システムで試してみましたが、正常に動作し、期待どおりに正しくソートされていました。しかし、どういうわけか、すべてのクラスファイルを削除し、保存用の新しいファイルも作成しました。これで、同じコード(再コンパイル後)が完全に奇妙な結果をもたらしました。count パラメータに基づいてソートすることすらありません。これはなぜですか?
次に、Windows 7 システムで同じコードを試してみましたが、再び正しい結果が得られ始めました。なぜそのような奇妙な行動をするのですか?助けてください。ありがとう。