19 Nov 2014, 15:15

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