JavaのSetは、Javaのセットです。
Java Set (ジャヴァ・セット)
このセクションでは、JavaのSetについての重要なポイントについて議論します。
- Java Set interface is a member of the Java Collections Framework.
- Unlike List, Set DOES NOT allow you to add duplicate elements.
- Set allows you to add at most one null element only.
- Set interface got one default method in Java 8: spliterator.
- Unlike List and arrays, Set does NOT support indexes or positions of it’s elements.
- Set supports Generics and we should use it whenever possible. Using Generics with Set will avoid ClassCastException at runtime.
- We can use Set interface implementations to maintain unique elements.
JavaのSetクラスの図解
Javaのセットメソッドを述べる。
このセクションでは、いくつかの便利なJava Setメソッドについて話し合います。
-
- 以下は、ネイティブの日本語での一つのオプションです。
int size(): Set内の要素数を取得します。
boolean isEmpty(): Setが空かどうかをチェックします。
boolean contains(Object o): 指定された要素がこのSetに含まれている場合にtrueを返します。
Iterator iterator(): このセットの要素上に反復子を返します。要素は特定の順序では返されません。
Object[] toArray(): このセットのすべての要素を含む配列を返します。このセットが要素を返す順序について保証がある場合、このメソッドは同じ順序で要素を返さなければなりません。
boolean add(E e): 指定された要素をこのセットに追加します(オプションの操作)。
boolean remove(Object o): 指定された要素をこのセットから削除します(オプションの操作)。
boolean removeAll(Collection c): 指定されたコレクションに含まれているこのセットの要素をすべて削除します(オプションの操作)。
boolean retainAll(Collection c): このセットに含まれている指定されたコレクションの要素のみを保持します(オプションの操作)。
void clear(): セットからすべての要素を削除します。
Iterator iterator(): このセットの要素に対する反復子を返します。
Javaの配列をセットに変換する
Listとは異なり、JavaのSetは直接配列に変換することはできません。なぜなら、Setは配列を使用していないからです。そのため、Arraysクラスを使用して配列のビューをセットとして取得することはできません。別のアプローチを取ることができます。Arrays.asList()メソッドを使用して配列をリストに変換し、それを使用してセットを作成することができます。この方法を使用することで、Javaの配列をセットに変換することができます。2つの方法がありますので、それぞれ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では、中間リストを使用せずに配列からセットを作成しません。まず、空のハッシュセットを作成し、次に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を配列に変換する
このセクションでは、以下に示すように、Set.toArray()メソッドを使用して、文字列のセットを文字列の配列に変換するプログラムを書きます。
import java.util.*;
public class SetToArray {
public static void main(String[] args) {
Set<String< vowelsSet = new HashSet<>();
// add example
vowelsSet.add("a");
vowelsSet.add("e");
vowelsSet.add("i");
vowelsSet.add("o");
vowelsSet.add("u");
//convert Set to Array
String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
System.out.println(Arrays.toString(strArray));
}
}
上記のプログラムを実行すると、以下に示す出力が得られます。
[a, e, u, i, o]
JavaのSetのソート方法
私たちが知っているように、セット(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のSetの共通操作
Java Setに対して一般的に行われる操作は、add、addAll、clear、sizeなどです。以下は、一般的なメソッドの使用例を示したシンプルなJava Setの例です。
import java.util.*;
public class SetCommonOperations
{
public static void main(String args[])
{
Set<String> vowels= new HashSet<>();
//add example
vowels.add("A");
vowels.add("E");
vowels.add("I");
//We cannot insert elements based on index to a Set
System.out.println(vowels);
Set<String> set = new HashSet<>();
set.add("O");
set.add("U");
//appending set elements to letters
vowels.addAll(set);
System.out.println(vowels);
//clear example to empty the set
set.clear();
//size example
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のSetを繰り返す方法のシンプルな例を示しています。
import java.util.*;
public class SetIteratorExample
{
public static void main(String[] args)
{
Set<Integer> set = new HashSet<>();
for(int i=0; i<5; i++)
set.add(i);
Iterator iterator = set.iterator();
//simple iteration
while(iterator.hasNext()){
int i = (int) iterator.next();
System.out.print(i + ", ");
}
System.out.println("\n" + set);
//modification of set using iterator
iterator = set.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next();
if(x%2 ==0) iterator.remove();
}
System.out.println(set);
//changing set structure while iterating
iterator = set.iterator();
while(iterator.hasNext()){
//ConcurrentModificationException here
int x = (int) iterator.next();
if(x==1) set.add(10);
}
}
}
JavaのSetをStreamに変換する
以下は、JavaのSetをStreamに変換し、要件に応じていくつかの操作を行う方法を示すシンプルな例です。
import java.util.*;
public class SetToStream {
public static void main(String[] args) {
Set<String> vowelsSet = new HashSet<>();
// add example
vowelsSet.add("a");
vowelsSet.add("e");
vowelsSet.add("i");
vowelsSet.add("o");
vowelsSet.add("u");
//convert set to stream
vowelsSet.stream().forEach(System.out::println);
}
}
結果: – 出力
a
e
u
i
o
Java SE 9のセット
Java SE 9のリリースでは、Oracle CorpはSetインターフェースにいくつかの便利なユーティリティメソッドを追加する予定です。これらを理解するために、いくつかのシンプルで使いやすい例をご紹介します。「Java SE 9:セットの生成メソッド」のチュートリアルをご覧いただき、ぜひ学習してください。これにてJavaのSetに関する簡単なまとめとなります。これらのJava Setの例が、セットのコレクションプログラミングの初歩に役立つことを願っています。私のチュートリアルをお読みいただき、ありがとうございました。もしも私のチュートリアルが気に入ったり、問題や提案、タイプのエラーなどがありましたら、コメントを投稿してください。