はじめに
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;
}
}