工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java TreeSet完全ガイド:操作、メソッド、実践例

Java TreeSet

Java CollectionsフレームワークのTreeSetクラスとそのさまざまな操作・メソッドを、実例を交えて学習します。

TreeSetクラスはツリー型データ構造の機能を提供し、NavigableSetインターフェースを拡張しています。

TreeSetの作成

TreeSetを作成するには、まずjava.util.TreeSetパッケージをインポートします:

TreeSet<Integer> numbers = new TreeSet<>();

引数なしで作成すると、要素は自然順序(昇順)でソートされます。Comparatorインターフェースを使用してソート順をカスタマイズすることも可能です。

TreeSetのメソッド

TreeSetクラスはセットに対するさまざまな操作を行うメソッドを提供します。

要素の挿入

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, 

要素の削除

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()メソッド

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()メソッド

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()メソッド

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の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

  1. Java演算子をマスター:種類、構文、実践例
  2. Javaコメント:種類、使い方、ベストプラクティス
  3. Java拡張forループをマスター:構文、例、ベストプラクティス
  4. Java文字列をマスター:生成、メソッド、ベストプラクティス
  5. Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
  6. Java無名インナークラス完全ガイド:定義、構文、実践例
  7. Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
  8. Javaアノテーション完全ガイド:種類、配置場所、実践例
  9. Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
  10. Javaコレクションアルゴリズム完全ガイド:ソート、シャッフル、検索など
  11. Java 乱数生成:Random クラスと Math.random 実践ガイド