JavaのComparator(コンパレータ)でPriorityQueueを実装する方法
JavaのPriorityQueue(優先度付きキュー)は、要素を優先度に応じて自動的に並べ替えるデータ構造です。デフォルトでは自然順序付け(昇順)で要素が取り出されますが、Comparatorを実装することで、降順や特定のフィールドに基づく独自の並び順を自由に定義できます。
以下は、Comparatorを介してPriorityQueueを実装するJavaのコード例です。
サンプルコード
import java.util.*;
public class Demo{
public static void main(String[] args){
Scanner my_scan = new Scanner(System.in);
PriorityQueue<Demo_class> my_pq = new PriorityQueue<Demo_class>(3, new demoComparator());
Demo_class obj_1 = new Demo_class("Joe", 25);
my_pq.add(obj_1);
Demo_class obj_2 = new Demo_class("Goldberg", 27);
my_pq.add(obj_2);
while (!my_pq.isEmpty()){
System.out.println(my_pq.poll().getName());
}
}
}
class demoComparator implements Comparator<Demo_class>{
public int compare(Demo_class s1, Demo_class s2){
if (s1.age < s2.age)
return 1;
else if (s1.age > s2.age)
return -1;
return 0;
}
}
class Demo_class{
public String name;
public int age;
public Demo_class(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
}
実行結果
Goldberg Joe
コードの解説
mainメソッドの処理内容
Demoクラスには、プログラムのエントリーポイントとなるmainメソッドが含まれています。ここでは、まずScannerオブジェクトを生成し、続いて初期容量「3」とカスタムコンパレータdemoComparatorを引数に指定してPriorityQueueを定義しています。
次に、Demo_classのインスタンスを2つ生成し、それぞれキューへ追加します。その後、whileループ内でキューが空でないかどうかを判定し、空でなければpoll()メソッドを呼び出して先頭の要素を取り出し、その名前を出力します。
Comparatorの実装
並び順の制御は、新しく定義したdemoComparatorクラスが担います。このクラスはComparator<Demo_class>インターフェースを実装しており、compareメソッド内で2つのインスタンスのageフィールドを比較します。
s1.age < s2.ageの場合 →1を返すs1.age > s2.ageの場合 →-1を返す- 等しい場合 →
0を返す
自然順序付けとは逆に、大きい値ほど先に取り出される仕組みのため、このキューは年齢の降順で要素を管理します。その結果、27歳の「Goldberg」が25歳の「Joe」よりも先に出力されます。
Demo_classの構造
Demo_classは、名前(name)と年齢(age)という2つのフィールドを持つクラスです。コンストラクタでこれらの値を初期化し、名前を返すgetNameメソッドを定義しています。
まとめ
このように、Comparatorを実装したクラスをPriorityQueueのコンストラクタに渡すことで、要素の並び順を柔軟に制御できます。オブジェクトを年齢やスコアなど特定のフィールドに基づいてソートしたい場合に非常に有効な手法なので、ぜひ活用してみてください。
-
Javaで編集可能なJLabelを実装する方法
JLabelとはJLabelクラスはJComponentクラスを継承しており、JLabelのオブジェクトを使用することで、GUI上にテキストによる説明や情報を表示できます。JLabelの主な特徴は以下のとおりです。1行の読み取り専用テキスト、画像、またはその両方を表示できる重要なメソッドとして、setText()、setIcon()、setBackground()、setOpaque()、setHorizontalAlignment()、setVerticalAlignment()などが用意されているPropertyChangeListenerインターフェースを明示的に登録して、プロパティの変
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー