4

PriorityQueuesに問題があります。これは、PriorityQueuesが優先順位で順序付けられていると思われるためですが、優先順位が何であるか(つまり、値が何であり、どこから来るのか)がわかりません。コンストラクターのコンパレーターを使用してpriorityQueueを作成できます。これを試しましたが、機能しません。

キュークラス:

public JavaPriorityFlightQueue() {
    super();
    flights = new PriorityQueue(5, new SortQueueViaPriority());
}

コンパレータ:

import java.util.Comparator;

public class SortQueueViaPriority implements Comparator {

    public int compare(Object o1, Object o2){
        Flight f1 = (Flight) o1; 
        Flight f2 = (Flight) o2;

        if( f1 == null || f2 == null ){
            if( f1 == f2 ) return 0;
            else if( f2 == null) return +1;
                else return -1;
        }

    Integer i1 = (Integer) f1.getPriority();
    Integer i2 = (Integer) f2.getPriority();
    return i2.compareTo(i1);
    }
}

優先度は、フライトクラスの一部であるint値です。これをテストします。

JavaPriorityFlightQueue flightQueue = new JavaPriorityFlightQueue();

Flight flight1 = new Flight("0001",9);
Flight flight2 = new Flight("0002",7);
Flight flight3 = new Flight("0003",1);
Flight flight4 = new Flight("0004",2);
Flight flight5 = new Flight("0005",1);

ただし、PriorityQueueは並べ替えられていません。チェックすると、値9は何とも比較されず、結果は何も並べ替えられません。比較クラスSortQueueViaPriorityは、クラスが完全にソートされる別のクラスからコピーして貼り付けられます。

4

3 に答える 3

3

次の例を試してみることをお勧めします。PriorityQueue をキューとして使用すると、エントリは順番に削除されます。

import java.util.Comparator;
import java.util.PriorityQueue;

public class Main {
    public static void main(String... args) {
        PriorityQueue<Flight> flights = new PriorityQueue<Flight>(5, new SortQueueViaPriority());
        flights.add(new Flight("0001", 9));
        flights.add(new Flight("0002", 7));
        flights.add(new Flight("0003", 1));
        flights.add(new Flight("0004", 2));
        flights.add(new Flight("0005", 1));

        while (!flights.isEmpty())
            System.out.println(flights.remove());
    }
}

class SortQueueViaPriority implements Comparator<Flight> {
    @Override
    public int compare(Flight f1, Flight f2) {
        return Integer.compare(f2.getPriority(), f1.getPriority());
    }
}

class Flight {
    private final String name;
    private final int priority;

    Flight(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    public int getPriority() {
        return priority;
    }

    @Override
    public String toString() {
        return "Flight{" +
                "name='" + name + '\'' +
                ", priority=" + priority +
                '}';
    }
}

版画

Flight{name='0001', priority=9}
Flight{name='0002', priority=7}
Flight{name='0004', priority=2}
Flight{name='0003', priority=1}
Flight{name='0005', priority=1}

注: PriorityQueue は、最初の要素のみが最小になるようにエントリを並べ替えます。キューを反復処理すると、すべての要素が表示されますが、順序どおりである場合とそうでない場合があります。

于 2012-11-12T15:38:53.073 に答える
2

問題はIterator.As Documented inJava doc of PriorityQueue#iterator

このキュー内の要素の反復子を返します。イテレータは特定の順序で要素を返すわけではありません。

イテレータを使用しているためtoString、順番に出力されません。または、イテレータに基づいてループを使用する場合も、順番になります。

そしてのJavaドキュメントでPriorityQueue

キューの取得操作は、キューの先頭にある要素にポーリング、削除、ピーク、および要素アクセスします。

結果を順番に取得するには、これらの方法のいずれかを使用する必要があります。

于 2012-11-12T16:02:30.297 に答える
0

インターフェースComparatorを使用する代わりに。Comparable

FlightクラスはComparableインターフェースを実装する必要があります。次に、メソッドをオーバーライドする必要がありますcompareTo()。そのメソッドでは、必要なプロパティに基づいて並べ替えるための独自のロジックを追加できます。

このように:

@Override
public int compareTo(Object obj) {
    // TODO Auto-generated method stub
    Flight f = (Flight)obj;
    if(this.a <f.a){
    return 1;
    }else{
        return -1;
    }
}
于 2012-11-12T16:03:48.613 に答える