1. ホーム
  2. java

[解決済み] PriorityQueueの使い方を教えてください。

2022-03-24 17:18:51

質問

を取得するにはどうすればよいですか? PriorityQueue をソートすることはできますか?

また offer add メソッドですか?

解決方法は?

を受け取るコンストラクタのオーバーロードを使用します。 Comparator<? super E> comparator で、ソート順に応じて適切な方法で比較を行うコンパレータを渡します。どのようにソートしたいかの例を示していただければ、コンパレータを実装するためのサンプルコードを提供します。(それはかなり簡単ですが)

他でも言われていることですが offeradd は、インターフェイスメソッドの実装が異なるだけです。JDKのソースでは add が呼び出す offer . しかし addoffer 持つ 潜在的に の機能により、一般的に異なる動作をします。 offer を使用すると、サイズの制限のために値を追加できないことを示すことができますが、この差は PriorityQueue のような、境界がないものです。

優先キューを文字列の長さでソートする例です。

// Test.java
import java.util.Comparator;
import java.util.PriorityQueue;

public class Test {
    public static void main(String[] args) {
        Comparator<String> comparator = new StringLengthComparator();
        PriorityQueue<String> queue = new PriorityQueue<String>(10, comparator);
        queue.add("short");
        queue.add("very long indeed");
        queue.add("medium");
        while (queue.size() != 0) {
            System.out.println(queue.remove());
        }
    }
}

// StringLengthComparator.java
import java.util.Comparator;

public class StringLengthComparator implements Comparator<String> {
    @Override
    public int compare(String x, String y) {
        // Assume neither string is null. Real code should
        // probably be more robust
        // You could also just return x.length() - y.length(),
        // which would be more efficient.
        if (x.length() < y.length()) {
            return -1;
        }
        if (x.length() > y.length()) {
            return 1;
        }
        return 0;
    }
}

以下はその出力です。

短い

ミディアム

実に長い