Java Set – JavaでのSet

Java Setは、重複する要素(またはオブジェクト)を含まない要素のコレクションです。Java Setは、Collectionインターフェースを拡張したインターフェースです。Listとは異なり、Java Setは順序付けられたコレクションではありません。要素に特定の順序はありません。Java Setは要素を挿入する位置を制御しません。インデックスを使用して要素にアクセスしたり、リスト内で要素を検索したりすることはできません。

Java Set

このセクションでは、Java Setに関するいくつかの重要なポイントについて説明します。

  • Java Setインターフェースは、Javaコレクションフレームワークのメンバーです。
  • Listとは異なり、Setでは重複する要素を追加することはできません。
  • Setは、最大で1つのnull要素のみを追加することができます。
  • Setインターフェースには、Java 8で1つのデフォルトメソッドspliteratorがあります。
  • Listや配列とは異なり、Setは要素のインデックスや位置をサポートしません。
  • Setはジェネリックスをサポートしており、可能な限り使用する必要があります。Setとジェネリックスを使用することで、実行時のClassCastExceptionを回避することができます。
  • Setインターフェースの実装を使用して一意の要素を維持することができます。

Java Setクラスのクラス図

Java SetインタフェースはCollectionインタフェースを拡張します。CollectionインタフェースはIterableインタフェースを拡張します。よく使用されるSet実装クラスには、HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、およびConcurrentSkipListSetがあります。AbstractSetは、Setインタフェースのスケルトン実装を提供し、Setの実装の労力を軽減します。

Java Setメソッド

このセクションでは、いくつかの便利なJava Setメソッドについて説明します:

  1. int size(): セット内の要素数を取得します。
  2. boolean isEmpty(): セットが空かどうかを確認します。
  3. boolean contains(Object o): 指定された要素をこのセットが含む場合はtrueを返します。
  4. Iterator iterator(): このセット内の要素に対するイテレータを返します。要素は特定の順序で返されます。
  5. Object[] toArray(): このセットのすべての要素を含む配列を返します。このセットが要素のイテレータによって返される順序に関する保証を行う場合、このメソッドは同じ順序で要素を返さなければなりません。
  6. boolean add(E e): このセットに指定された要素を追加します(オプションの操作)。
  7. boolean remove(Object o): このセットから指定された要素を削除します(オプションの操作) 。
  8. boolean removeAll(Collection c): このセットから、指定されたコレクションに含まれるすべての要素を削除します(オプションの操作) 。
  9. boolean retainAll(Collection c): このセットに含まれる要素のうち、指定されたコレクションに含まれる要素のみを保持します(オプションの操作) 。
  10. void clear(): セットからすべての要素を削除します。
  11. Iterator iterator(): このセットの要素に対する反復子を返します。

Java Array to Set

リストとは異なり、Javaセットを直接配列に変換することはできません。なぜなら、配列を使用していないためです。したがって、配列のビューをセットとして取得するためにArraysクラスを使用することはできません。別のアプローチを使用できます。Arrays.asList()メソッドを使用して配列をリストに変換し、それを使用してセットを作成できます。このアプローチを使用すると、Java配列をセットに変換できます。2つの方法があります。それらを1つずつ、1つのシンプルな例を使用して議論しましょう。アプローチ-1このアプローチでは、最初に、指定された配列を使用してリストを作成し、それを使用してセットを作成する必要があります。

import java.util.*;

public class ArrayToSet {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet>(Arrays.asList(vowels));
	System.out.println(vowelsSet);
	
	/**
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

アプローチ-2このアプローチでは、中間リストを使用せずに配列からセットを作成しません。まず、空のHashSetを作成し、次にCollections.addAll()を使用して、指定されたセットに配列要素をコピーします。

import java.util.*;

public class ArrayToSet2 {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet<>();
	Collections.addAll(vowelsSet, vowels); 
	System.out.println(vowelsSet);

	/** 
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

出力:-上記の2つのプログラムを実行すると、以下に示すような同じ出力が得られます。

[a, e, u, i, o]
[a, u, i, o]
[]

Javaセットを配列に変換

このセクションでは、Set.toArray()メソッドを使用して、文字列のセットを文字列の配列に変換するプログラムを以下に示します。

import java.util.*;

public class SetToArray {
   public static void main(String[] args) {
	Set();

	// 例を追加
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// SetをArrayに変換
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

出力:-上記のプログラムを実行すると、以下に示すような出力が得られます。

[a, e, u, i, o]

Javaセットのソート

私たちは知っているように、セット(HashSet)は要素のソートを直接サポートしません。要素をランダムな順序で保存および表示します。ただし、以下に示すように、要素をソートするいくつかのアプローチがあります。

import java.util.*;

public class SetSortingExample {

	public static void main(String[] args) {
		Set<Integer> intsSet = new HashSet<>();
		Random random = new Random();
		for (int i = 0; i  {return (o2-o1);});
		System.out.println("Reverse Sorting: " + intsList2);

		// Approach-3
		Set<Integer> sortedSet = new TreeSet<>(intsSet);
		System.out.println("Sorted Set: " + sortedSet);
	}
}

出力:-上記のプログラムを実行すると、次の出力が表示されます。

[560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Natural Sorting: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Before Sorting: [560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Reverse Sorting: [864, 657, 589, 560, 555, 176, 135, 123, 103, 40]
Sorted Set: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]

Javaセットの共通操作

Javaセットで実行される最も一般的な操作は、add、addAll、clear、sizeなどです。以下は、共通のメソッドの使用を示すシンプルなJavaセットの例です。

import java.util.*;

public class SetCommonOperations 
{
   public static void main(String args[]) 
   {
	Set vowels= new HashSet<>();
		
	//追加の例
	vowels.add("A");
	vowels.add("E");
	vowels.add("I");

	//インデックスを使用してセットに要素を挿入することはできません
	System.out.println(vowels);
		
	Set set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	//セットの要素を文字に追加
	vowels.addAll(set);
	System.out.println(vowels);
	
	//セットを空にするクリアの例
	set.clear();
		
	//サイズの例
	System.out.println("letters set size = " + vowels.size());
		
	vowels.clear();
	vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
	System.out.println("Given set contains E element or not? = " + vowels.contains("E"));
		
   }
}

出力:-

[A, E, I]
[A, E, U, I, O]
letters set size = 5
Given set contains E element or not? = true

Javaセットのイテレータ

以下は、Javaセットを反復処理する方法を示すシンプルな例です。

import java.util.*;

public class SetIteratorExample
{
   public static void main(String[] args) 
   {

	Set set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	//シンプルな反復
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	//イテレータを使用してセットを変更
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	//反復中にセットの構造を変更
	iterator = set.iterator();
	while(iterator.hasNext()){
                //ここでConcurrentModificationExceptionが発生
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

Javaセットをストリームに変換

以下は、Javaセットをストリームに変換し、要件に応じていくつかの操作を実行する方法を示すシンプルな例です。

import java.util.*;

public class SetToStream {

   public static void main(String[] args) {
	Set vowelsSet = new HashSet<>();
	//追加の例
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	
	vowelsSet.stream().forEach(System.out::println);
   }
}

出力:

a
e
u
i
o

Java SE 9 Set

Java SE 9リリースでは、Oracle CorpがSetインターフェースにいくつかの便利なユーティリティメソッドを追加する予定です。それらをいくつかのシンプルで有用な例で理解することができればより良いです。詳細は「Java SE 9: Set Factory Methods」のチュートリアルを参照してください。これでJavaのSetに関するクイックなまとめが終わります。これらのJava Setの例がSetコレクションプログラミングの始めに役立つことを願っています。チュートリアルを読んでいただきありがとうございます。もしもチュートリアルが気に入ったり、問題や提案、タイプミスがあればコメントを残してください。

Source:
https://www.digitalocean.com/community/tutorials/java-set