Java TreeSet完全ガイド:操作、メソッド、実践例
Java TreeSet
Java CollectionsフレームワークのTreeSetクラスとそのさまざまな操作・メソッドを、実例を交えて学習します。
TreeSetクラスはツリー型データ構造の機能を提供し、NavigableSetインターフェースを拡張しています。
TreeSetの作成
TreeSetを作成するには、まずjava.util.TreeSetパッケージをインポートします:
TreeSet<Integer> numbers = new TreeSet<>();
引数なしで作成すると、要素は自然順序(昇順)でソートされます。Comparatorインターフェースを使用してソート順をカスタマイズすることも可能です。
TreeSetのメソッド
TreeSetクラスはセットに対するさまざまな操作を行うメソッドを提供します。
要素の挿入
add()– 指定要素をセットに挿入addAll()– 指定コレクションのすべての要素を挿入
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
evenNumbers.add(6);
System.out.println("TreeSet: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.addAll(evenNumbers);
System.out.println("新しいTreeSet: " + numbers);
}
}
出力
TreeSet: [2, 4, 6] 新しいTreeSet: [1, 2, 4, 6]
要素へのアクセス
iterator()メソッドを使用して要素にアクセスします。java.util.Iteratorパッケージのインポートが必要です:
import java.util.TreeSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
Iterator<Integer> iterate = numbers.iterator();
System.out.print("Iteratorを使用したTreeSet: ");
while (iterate.hasNext()) {
System.out.print(iterate.next() + ", ");
}
}
}
出力
TreeSet: [2, 5, 6] Iteratorを使用したTreeSet: 2, 5, 6,
要素の削除
remove()– 指定要素を削除removeAll()– すべての要素を削除
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
boolean value1 = numbers.remove(5);
System.out.println("5は削除されましたか? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("すべての要素は削除されましたか? " + value2);
}
}
出力
TreeSet: [2, 5, 6] 5は削除されましたか? true すべての要素は削除されましたか? true
ナビゲーション用メソッド
TreeSetはNavigableSetを実装しているため、要素をナビゲートするさまざまなメソッドを提供します。
1. first()とlast()メソッド
first()– セットの最初の要素を返すlast()– セットの最後の要素を返す
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
int first = numbers.first();
System.out.println("最初の数値: " + first);
int last = numbers.last();
System.out.println("最後の数値: " + last);
}
}
出力
TreeSet: [2, 5, 6] 最初の数値: 2 最後の数値: 6
2. ceiling()、floor()、higher()、lower()メソッド
- higher(element) – 指定
elementより大きい要素のうち最小のものを返す - lower(element) – 指定
elementより小さい要素のうち最大のものを返す - ceiling(element) – 指定element以上で最小の要素を返す。要素が存在する場合はその要素を返す
- floor(element) – 指定
element以下で最大の要素を返す。要素が存在する場合はその要素を返す
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("higher(4): " + numbers.higher(4));
System.out.println("lower(4): " + numbers.lower(4));
System.out.println("ceiling(4): " + numbers.ceiling(4));
System.out.println("floor(3): " + numbers.floor(3));
}
}
出力
TreeSet: [2, 4, 5, 6] higher(4): 5 lower(4): 2 ceiling(4): 4 floor(3): 2
3. pollFirst()とpollLast()メソッド
pollFirst()– 最初の要素を取得して削除pollLast()– 最後の要素を取得して削除
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("削除された最初の要素: " + numbers.pollFirst());
System.out.println("削除された最後の要素: " + numbers.pollLast());
System.out.println("新しいTreeSet: " + numbers);
}
}
出力
TreeSet: [2, 4, 5, 6] 削除された最初の要素: 2 削除された最後の要素: 6 新しいTreeSet: [4, 5]
4. headSet()、tailSet()、subSet()メソッド
headSet(element, booleanValue)
指定elementより前のすべての要素を返します。booleanValueは省略可能でデフォルトはfalse。trueを指定すると指定要素を含みます。
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("headSet(5) デフォルト: " + numbers.headSet(5));
System.out.println("headSet(5, true): " + numbers.headSet(5, true));
}
}
出力
TreeSet: [2, 4, 5, 6] headSet(5) デフォルト: [2, 4] headSet(5, true): [2, 4, 5]
tailSet(element, booleanValue)
指定element以降のすべての要素を返します(指定要素を含む)。booleanValueのデフォルトはtrue。falseを指定すると指定要素を含みません。
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("tailSet(4) デフォルト: " + numbers.tailSet(4));
System.out.println("tailSet(4, false): " + numbers.tailSet(4, false));
}
}
出力
TreeSet: [2, 4, 5, 6] tailSet(4) デフォルト: [4, 5, 6] tailSet(4, false): [5, 6]
subSet(e1, bv1, e2, bv2)
e1とe2の間の要素を返します(e1を含む)。bv1のデフォルトはtrue、bv2のデフォルトはfalseです。
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(4);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
System.out.println("subSet(4, 6) デフォルト: " + numbers.subSet(4, 6));
System.out.println("subSet(4, false, 6, true): " + numbers.subSet(4, false, 6, true));
}
}
出力
TreeSet: [2, 4, 5, 6] subSet(4, 6) デフォルト: [4, 5] subSet(4, false, 6, true): [5, 6]
セット操作
TreeSetのメソッドを使用してさまざまなセット操作を行えます。
和集合
addAll()メソッドを使用します:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("TreeSet2: " + numbers);
numbers.addAll(evenNumbers);
System.out.println("和集合: " + numbers);
}
}
出力
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] 和集合: [1, 2, 3, 4]
積集合
retainAll()メソッドを使用します:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
System.out.println("TreeSet2: " + numbers);
numbers.retainAll(evenNumbers);
System.out.println("積集合: " + numbers);
}
}
出力
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] 積集合: [2]
差集合
removeAll()メソッドを使用します:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet2: " + numbers);
numbers.removeAll(evenNumbers);
System.out.println("差集合: " + numbers);
}
}
出力
TreeSet1: [2, 4] TreeSet2: [1, 2, 3, 4] 差集合: [1, 3]
部分集合の確認
containsAll()メソッドを使用します:
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet1: " + numbers);
TreeSet<Integer> primeNumbers = new TreeSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("TreeSet2: " + primeNumbers);
boolean result = numbers.containsAll(primeNumbers);
System.out.println("TreeSet2はTreeSet1の部分集合ですか? " + result);
}
}
出力
TreeSet1: [1, 2, 3, 4] TreeSet2: [2, 3] TreeSet2はTreeSet1の部分集合ですか? true
TreeSetのその他のメソッド
| メソッド | 説明 |
|---|---|
clone() | TreeSetのコピーを作成 |
contains() | 指定要素を検索し、boolean結果を返す |
isEmpty() | TreeSetが空かどうかを確認 |
size() | TreeSetのサイズを返す |
clear() | TreeSetからすべての要素を削除 |
TreeSet vs HashSet
両方ともSetインターフェースを実装していますが、違いがあります:
TreeSetは要素が順序付けられて格納される(SortedSetを実装)TreeSetはナビゲーション用メソッドを提供(NavigableSetを実装)HashSetは基本操作(add、remove、contains、size)でTreeSetより高速
TreeSetのComparator
これまでの例では自然順序でしたが、Comparatorを使用して順序をカスタマイズできます:
import java.util.TreeSet;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
// カスタムComparatorでTreeSetを作成
TreeSet<String> animals = new TreeSet<>(new CustomComparator());
animals.add("Dog");
animals.add("Zebra");
animals.add("Cat");
animals.add("Horse");
System.out.println("TreeSet: " + animals);
}
// Comparatorクラスの作成
static class CustomComparator implements Comparator<String> {
@Override
public int compare(String animal1, String animal2) {
int value = animal1.compareTo(animal2);
// 逆順でソート
if (value > 0) return -1;
else if (value < 0) return 1;
else return 0;
}
}
}
出力
TreeSet: [Zebra, Horse, Dog, Cat]
上記例では、CustomComparatorクラスを引数としてTreeSetを作成しています。compare()メソッドをオーバーライドして逆順ソートを実現しています。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Javaコレクションアルゴリズム完全ガイド:ソート、シャッフル、検索など
- Java 乱数生成:Random クラスと Math.random 実践ガイド