• このエントリーをはてなブックマークに追加

スポンサードリンク

はじめに

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;
	}
}