Java で TreeSet と Comparator を実装した

    はじめに

    Java で, 順序づけをした集合をイテレーティブに処理したい.

    ちなみに, PriorityQueue では, 実現できなかった…

    TreeSet

    SortedSet, TreeSet を利用する.

    SortedSet はインタフェース, TreeSet は クラスという違いがある.

    Comparator

    順序をつけるために java.util.Comparator インタフェースを利用する. これは,コレクションの順序づけをおこなうための比較関数,compare をもつ.

    以下の記事が詳しい.

    具体例

    優先度をもつ以下のようなオブジェクトを TreeSet に格納することを考える.

    class MyClass {
        private char a;
        private int priority;
    
        public MyClass (char a, int priority) {
            this.a = a;
            this.priority = priority;
        }
    
        public int getPriority () {
            return priority;
        }
    
        public String toString () {
            return "char: " + a + " priority: " + priority;
        }
    }

    まずは, Comparator を作成する.

    import java.util.Comparator;
    
    class MyComparator implements Comparator {
        @Override
        public int compare (Object arg0, Object arg1) {
            MyClass x = (MyClass) arg0;
            MyClass y = (MyClass) arg1;
    
            int xp = x.getPriority ();
            int yp = y.getPriority ();      
    
            if (xp < yp) {
                return 1;
            } else if (xp > yp) {
                return -1;
            } else{
                return 0;
            }
        }
    }

    最後に TreeSet の実装.

    import java.util.TreeSet;
    
    public class SortedSetSample {
        public static void main (String[] args) {
            MyClass A = new MyClass ('a', 3);       
            MyClass B = new MyClass ('b', 1);
            MyClass C = new MyClass ('c', 2);
    
            TreeSet<MyClass> set = new TreeSet<MyClass>(new MyComparator ());
    
            set.add (A);
            set.add (B);
            set.add (C);
    
            for (MyClass obj: set) {
                System.out.println (obj);
            }
        }
    }

    実行結果

    char: a priority: 3
    char: c priority: 2
    char: b priority: 1

    Full Code

    import java.util.Comparator;
    import java.util.TreeSet;
    
    public class SortedSetSample {
        public static void main (String[] args) {
            MyClass A = new MyClass ('a', 3);       
            MyClass B = new MyClass ('b', 1);
            MyClass C = new MyClass ('c', 2);
    
            TreeSet<MyClass> set = new TreeSet<MyClass>(new MyComparator ());
    
            set.add (A);
            set.add (B);
            set.add (C);
    
            for (MyClass obj: set) {
                System.out.println (obj);
            }
        }
    }
    
    class MyComparator implements Comparator {
        @Override
        public int compare (Object arg0, Object arg1) {
            MyClass x = (MyClass) arg0;
            MyClass y = (MyClass) arg1;
    
            int xp = x.getPriority ();
            int yp = y.getPriority ();      
    
            if (xp < yp) {
                return 1;
            } else if (xp > yp) {
                return -1;
            } else{
                return 0;
            }
        }
    }
    
    class MyClass {
        private char a;
        private int priority;
    
        public MyClass (char a, int priority) {
            this.a = a;
            this.priority = priority;
        }
    
        public int getPriority () {
            return priority;
        }
    
        public String toString () {
            return "char: " + a + " priority: " + priority;
        }
    }

    Special Thanks