Javaセットとは
Set はJava Collection Framework のインターフェイスですが、Listとは異なり、順序付きコレクションではありません。つまり、Java Set要素は特定の順序なしで保持されます。したがって、要素を挿入できる位置を制御することはできません。また、インデックスによって要素にアクセスすることもできません。数学的には、セットは固有の要素のコレクションです。実際、これは順序のないコレクション (順序付けされていないコレクション) であり、同じ要素を格納することはできません。意図的に重複した要素をSetに追加した場合、このアクションは無視され、Set は変更されません。ただし、null 要素を 1 つ格納することは許可されます。セットの実装
Java Set はインターフェースであるため、オブジェクトを作成するにはその実装の 1 つを使用する必要があります。これらは、 HashSet、TreeSet、およびLinkedHashSetです。Setでは、各要素は 1 つのインスタンスのみに格納され、Set の実装ごとに要素の格納に異なる順序が使用されます。HashSetでは、要素の順序は複雑なアルゴリズムによって決定されます。格納順序が重要な場合は、比較順序で昇順に並べ替えられたオブジェクトを格納するTreeSetコンテナ、またはLinkedHashSetを使用します。、要素を追加の順序で保存します。セットは、オブジェクトが特定のセットに属しているかどうかを簡単に確認できるように、メンバーシップ テストによく使用されます。そのため、実際には、高速検索用に最適化された HashSet実装が通常選択されます。HashSet は、 hashCode()メソッドによって返されたハッシュ値を使用して要素を内部に格納するコレクションです。つまり、HashSet<E>の内部には、HashSetの値をキーとして保存するHashMap<E, Object>オブジェクトが保存されます。ハッシュ コードを使用すると、 Setの要素をすばやく検索、追加、削除できます。 LinkedHashSet はハッシュセットですまた、リンクされたリストに要素も保存されます。通常のHashSet は要素の順序を維持しません。第一に、それは公式には存在しないだけであり、第二に、たった 1 つの要素が追加されるだけで内部の順序さえも劇的に変化する可能性があります。また、 LinkedHashSetからイテレータを取得し、それを使用して、 LinkedHashSetに追加された順序とまったく同じ順序ですべての要素を処理することができます。頻繁ではありませんが、場合によっては非常に必要になることがあります。TreeSet は、要素を値順のツリーとして格納するコレクションです。TreeSet<E>内には、これらすべての値を格納するTreeMap<E, Object>があります。そしてこのツリーマップ赤と黒のバランスのとれた二分木を使用して要素を保存します。したがって、add()、remove()、contains()の各操作が非常に高速になります。セットオブジェクトの作成
セットオブジェクトを作成するには、次のいずれかの形式を使用できます。Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
これは簡単な例で、 HashSetとLinkedHashSet という2 つのSet を作成し、それぞれに 5 つの要素を追加します。これにはadd()メソッドを使用できます。
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set mySet = new HashSet();
Set mySet2 = new LinkedHashSet();
//adding some string elements
mySet.add("Stuart");
mySet.add("Alex");
mySet.add("Johnny");
mySet.add("Igor");
mySet.add("Bel");
System.out.println(mySet);
mySet2.add("Stuart");
mySet2.add("Alex");
mySet2.add("Johnny");
mySet2.add("Igor");
mySet2.add("Bel");
System.out.println(mySet2);
}
}
プログラムの出力は次のとおりです。
Java セットメソッド
Java Set の重要なメソッドのいくつかを次に示します。-
ブール値 add(E e)。指定された要素がまだ存在しない場合は、セットに追加します (オプションの操作)。
-
ブール値のremove(Object o)。指定された要素が存在する場合、このセットから削除します (オプションの操作)。
-
ブール値のremoveAll(コレクションc)。指定されたコレクションに含まれるすべての要素をこのセットから削除します (オプションの操作)。
-
ブール値保持All(コレクションc)。指定されたコレクションに含まれるこのセット内の要素のみを保持します (オプションの操作)。
-
void clear()。セットからすべての要素を削除します。
-
イテレータ iterator()。このセット内の要素に対する反復子を返します。
-
int size()。Set 内の要素の数を取得するために使用されます。
-
ブール値 isEmpty()。Set が空かどうかを確認します。
-
ブール値 contains(Object o)。この Set に指定された要素が含まれている場合は true を返します。
-
イテレータ iterator()。このセット内の要素に対する反復子を返します。要素は特定の順序で返されません。
-
Object[] toArray()。このセット内のすべての要素を含む配列を返します。このセットがその反復子によってその要素がどの順序で返されるかを保証する場合、このメソッドは同じ順序で要素を返さなければなりません。
Java Set の主な操作の例
この例では、文字列の配列を作成し、Arrays.asListオペレーションを使用してそれをmySetに渡します。次に、さらにいくつかの要素を削除し、さらにいくつかの要素を追加します。この場合、セット内の要素の 1 つはすでに存在するため、追加されません。また、空であるかどうかをチェックするisEmpty()、セットのサイズを決定する size ()、およびすべての要素のセットをクリアするclear()という操作も試します。import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class HashSetTest2 {
public static void main(String[] args) {
//creating a string Array with some names
String [] friends = {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
//creating a new set and adding elements from string array into it
Set<String> mySet = new HashSet<>(Arrays.asList(friends));
System.out.println(mySet);
//removing two elements from the set
mySet.remove("Igor");
mySet.remove("Stuart");
System.out.println(mySet);
//adding 2 new Elements into set
mySet.add("Dasha");
mySet.add("Alex"); //it's second Alex, can't be added
System.out.println(mySet);
//cheking the size of mySet
int size = mySet.size();
System.out.println("The quantity of set's elements = " + size);
//Checking if the set is empty
System.out.println("Is mySet empty? " + mySet.isEmpty());
//checking if some elements are in set
System.out.println("Is Igor in set? " + mySet.contains("Igor"));
System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
//deleting all elements from the set
mySet.clear();
System.out.println("Is mySet empty now? " + mySet.isEmpty());
}
}
プログラムの出力は次のとおりです。
LinkedHashSet を Array に設定した例
別のプログラムを書いてみましょう。その中で、 LinkedHashSetに基づいてセットを作成し、それに要素を追加して、セットを配列に変換します。import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSet3 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("C");
set.add("D");
set.add("E");
set.add("F");
set.add("G");
set.add("A");
set.add("B");
System.out.println(set);
set.remove("F");// removing an element from our set
set.remove("C sharp");//trying to remove element that isn't in set
System.out.println(set.remove("C sharp"));
System.out.println("Print our set with elements removed: ");
System.out.println(set);
//set to array
String strArray[] = set.toArray(new String[set.size()]);
System.out.println("New Array from set: ");
System.out.println(Arrays.toString(strArray));
System.out.println(strArray[0]);
}
}
プログラムの出力は次のとおりです。
イテレータを使用したセット例
セットを作成し、それを反復子を使用して出力し、さらに反復子を使用してそこからすべての偶数を削除しましょう。import java.util.*;
public class SetTest5
{
public static void main(String[] args)
{
Set<Integer> mySet = new HashSe<>();
for(int i = 0; i < 10; i++)
mySet.add(i);
Iterator iterator = mySet.iterator();
//simple iteration
while(iterator.hasNext()){
int i = (int) iterator.next();
}
System.out.println(" " + mySet);
//modification of mySet using iterator - removing all even numbers
iterator = mySet.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next();
if(x%2 == 0) iterator.remove();
}
System.out.println(mySet);
}
}
プログラムの出力は次のとおりです。
TreeSet を使用した例
並べ替えが重要な場合は、TreeSet実装を使用してください。この短い例では、前の例と同様に、友人の名前をセットに入力します。ただし、ソートされたTreeSetでは、要素はソートされた順序ですぐに書き込まれます。この場合、名前はアルファベット順に表示されます。import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
Set mySet = new TreeSet<>();
mySet.add("Stuart");
mySet.add("Alex");
mySet.add("Johnny");
mySet.add("Igor");
mySet.add("Bel");
System.out.println(mySet);
}
出力は次のとおりです。
簡単な結論
-
Java Setインターフェースは Java Collections Framework の一部です。
-
実装されたクラス: AbstractSet、ConcurrentHashMap.KeySetView、ConcurrentSkipListSet、CopyOnWriteArraySet、EnumSet、HashSet、JobStateReasons、LinkedHashSet、TreeSet。
-
最も一般的なSet実装は、 HashSet、LinkedHashSet、およびTreeSetです。
-
HashSet要素の順序は、複雑なアルゴリズムによって決定されます。格納順序が重要な場合は、オブジェクトを比較順序で昇順に格納するTreeSetコンテナ、または要素を追加順に格納するLinkedHashSet を使用します。
-
ほとんどの場合、セットはメンバーシップをテストするために使用されます。つまり、オブジェクトが数学的な意味で特定のセットに属しているかどうかを確認します。したがって、実際にはすべてのSet実装の中で最も多くの場合、HashSet が選択されるのが通常です。この実装は高速検索用に最適化されています。
-
重複した要素をセットに追加することはできないため、Setインターフェイスの実装を使用して一意の要素を保存できます。
-
Set では、 null 要素を 1 つだけ追加できます。
-
Set はリストではないため、その要素のインデックスや位置はサポートされません。
GO TO FULL VERSION