2013年4月27日土曜日

[java]ある集合内で近い値を求める

たとえば、1,2,4,8,16,32みたいな配列があって、その中から10に近い値を求めたい。みたいなことがあると思います。そんな時はTreeSet<T>を使います。
コードはこんな感じ。

public static void main(String[] args) {

    TreeSet<Integer> treeSet = new TreeSet<Integer>();
    for (int i = 1; i < 10; i++) {
        treeSet.add((int) Math.pow(2, i));
    }

    //[2, 4, 8, 16, 32, 64, 128, 256, 512]
    System.out.println("floor 10 -> " + treeSet.floor(10));
    System.out.println("floor 20 -> " + treeSet.floor(20));
    System.out.println("floor 64 -> " + treeSet.floor(64));
    System.out.println("ceiling 10 -> " + treeSet.ceiling(10));
    System.out.println("ceiling 20 -> " + treeSet.ceiling(20));
    System.out.println("ceiling 64 -> " + treeSet.ceiling(64));

}

■結果
floor 10 -> 8
floor 20 -> 16
floor 64 -> 64
ceiling 10 -> 16
ceiling 20 -> 32
ceiling 64 -> 64

TreeSet<T>なんて、ソートしてくれるだけじゃ?と思っていたら大間違いでした。。。
これ以外にも
  • 指定数未満の集合を得る:headSet(E toElement) 
  • 指定数より大きい値の集合を得る:tailSet(E fromElement) 
  • 指定数以上、指定数未満の集合を得る:subSet(E fromElement, E toElement) 

など、便利そうなやつが結構ある。
ほかのコレクションクラスのリファレンスも改めて見直ししたくなりました。

0 件のコメント: