Javaで複数条件でソートする。 - ITエンジニアの技術メモ
で扱った題材を優先度付きキュー PriorityQueue を使って実装してみた。
以下のような感じになる。
Queue<Work> queue = new PriorityQueue(Comparator. comparing(Work::getReward, Comparator.reverseOrder()). thenComparing(Work::getTimeToFinish)); queue.add(new Work(1, 3)); queue.add(new Work(3, 8)); queue.add(new Work(2, 6)); queue.add(new Work(3, 7)); queue.add(new Work(1, 4)); queue.add(new Work(4, 6)); while (true) { Work work = queue.poll(); if (work == null) { break; } System.out.println("TimeToFinish: " + work.getTimeToFinish() + ", Reward: " + work.getReward()); } }
実行結果は以下になる。(前記事と同じ結果)
TimeToFinish: 3, Reward: 8
TimeToFinish: 3, Reward: 7
TimeToFinish: 2, Reward: 6
TimeToFinish: 4, Reward: 6
TimeToFinish: 1, Reward: 4
TimeToFinish: 1, Reward: 3
なお、この PriorityQueue から要素を取り出す時に、iterator を使うと、意図した順番で取得できないので注意。
PriorityQueue (Java Platform SE 8)
iterator()メソッド内で提供されるIteratorでは、特定の順序で優先度キューの要素をトラバースすることは保証されません。