JAva入門---データ構造の列挙(Enumeration)&ビットセット(BitSet)
Javaツールパッケージは、強力なデータ構造を提供します.Javaのデータ構造には、主に次のインタフェースとクラスが含まれます.列挙(Enumeration) ビット集合(BitSet) ベクトル(Vector) スタック 辞書(Dictionary) ハッシュテーブル プロパティ これらのクラスは伝統的に残されており,Java 2には新しいフレームワークであるコレクションフレームワーク(Collection)が導入されており,後述する文書に記録される.しかし,この論文では主に列挙(Enumeration)&ビット集合(BitSet)の2つのデータ構造を見る.まず列挙(Enumeration)である.
エニュメレーションインタフェースは、それ自体がデータ構造に属していないが、他のデータ構造の範疇で広く応用されている.エニュメレーション(The Enumeration)インタフェースは、データ構造から連続要素を取り出す方法を定義します.例えば、列挙は、複数の要素を含むデータ構造の次の要素を得るためのnextElementという方法を定義します.
Enumerationインタフェースにはいくつかの方法が定義されています.これらの方法で列挙できるオブジェクトセット内の要素を一度に取得します.このような従来のインタフェースは反復器に置き換えられています.Enumerationはまだ破棄されていませんが、現代のコードではあまり使用されていません.それでも、VectorやPropertiesなどの従来のクラスで定義された方法で使用されています.それ以外にもいくつかのAPIクラスで使用されており、アプリケーションでも広く使用されています使用します.次の表では、Enumeration宣言の方法をまとめます.
シーケンス番号
メソッドの説明
1
boolean hasMoreElements()は、この列挙により多くの要素が含まれているかどうかをテストします.
2
Object nextElement()この列挙オブジェクトに少なくとも1つの提供可能な要素がある場合、この列挙の次の要素が返されます.
次の例では、Enumerationの使用方法を示します.
import java.util.Vector;import java.util.Enumeration; public class EnumerationTester { public static void main(String args[]) { Enumeration days; Vector dayNames = new Vector(); dayNames.add("Sunday"); dayNames.add("Monday"); dayNames.add("Tuesday"); dayNames.add("Wednesday"); dayNames.add("Thursday"); dayNames.add("Friday"); dayNames.add("Saturday"); days = dayNames.elements(); while (days.hasMoreElements()){ System.out.println(days.nextElement()); } }}
実行結果:
次に、下位集合(BitSet)を見てみましょう.ビット集合クラスは、個別に設定および消去できるビットまたはフラグのセットを実現します.このクラスは、ブール値のセットを処理するときに非常に役立ちます.各値に「ビット」を割り当て、ビットを適切に設定またはクリアするだけで、ブール値を操作できます.
Bitsetクラスは、ビット値を保存するための特殊なタイプの配列を作成します.BitSetの配列サイズは必要に応じて大きくなります.これはビットベクトル(vector of bits)と似ています.これは従来のクラスですが、Java 2で完全に再設計されています.BitSetは2つの構築方法を定義し、最初の構築方法はデフォルトのオブジェクトを作成します.
2つ目の方法では、ユーザーが初期サイズを指定できます.すべてのビットを0に初期化:
BitSetでCloneableインタフェースで定義されているメソッドは、次の表に示されています.
シーケンス番号
メソッドの説明
1
void and(BitSet set)は、このターゲットビットsetおよびパラメータビットsetに対して論理および動作を実行する.
2
void andNot(BitSet set)は、指定したBitSetで設定されている対応するビットをすべて消去します.
3
int cardinality()は、BitSetでtrueに設定されているビット数を返します.
4
void clear()このBitSetのすべてのビットをfalseに設定します.
5
void clear(int index)は、インデックス指定のビットをfalseに設定します.
6
void clear(int startIndex,int endIndex)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)の範囲内のビットをfalseに設定します.
7
Object clone()このBitSetをコピーし、それに等しい新しいBitSetを生成します.
8
boolean equals(Object bitSet)このオブジェクトを指定したオブジェクトと比較します.
9
void flip(int index)は、指定したインデックスのビットを現在の値の符号化に設定します.
10
void flip(int startIndex,int endIndex)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)の範囲内の各ビットに対して、現在値の補符号を設定する.
11
boolean get(int index)は、指定したインデックスのビット値を返します.
12
BitSet get(int startIndex,int endIndex)は、BitSet内のfromIndex(含む)からtoIndex(含まない)までの範囲のビット組成を返す新しいBitSetを返す.
13
int hashCode()は、このビットsetのハッシュコード値を返す.
14
boolean intersects(BitSet bitSet)指定されたBitSetにtrueに設定されたビットがあり、このBitSetにおいてもtrueに設定されている場合は、tureに戻ります.
15
boolean isEmpty()このBitSetにtrueに設定されたビットが含まれていない場合は、tureに戻ります.
16
int length()は、このBitSetの論理サイズを返します.BitSetの最高設定ビットのインデックスに1を追加します.
17
int nextClearBit(int startIndex)は、指定された開始インデックスまたはその後のインデックスで発生するfalseに設定された最初のビットのインデックスを返します.
18
int nextSetBit(int startIndex)は、指定された開始インデックスまたはその後のインデックスに発生する最初のtrueに設定されたビットのインデックスを返します.
19
void or(BitSet bitSet)はこのビットsetとビットsetパラメータに対して論理または操作を実行する.
20
void set(int index)は、指定したインデックスのビットをtrueに設定します.
21
void set(int index,boolean v)は、指定したインデックスのビットを指定した値に設定します.
22
void set(int startIndex,int endIndex)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)の範囲内のビットをtrueに設定します.
23
void set(int startIndex,int endIndex,boolean v)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)までの範囲内のビットを指定された値に設定します.
24
int size()このBitSetがビット値を表すときに実際に使用するスペースのビット数を返します.
25
String toString()は、このビットsetの文字列表現形式を返します.
26
void xor(BitSet bitSet)は、このビットsetおよびビットsetパラメータに対して論理的または動作を実行する.
次のプログラムでは、このデータ構造がサポートするいくつかの方法を説明します.
import java.util.BitSet; public class BitSetDemo { public static void main(String args[]) { BitSet bits1 = new BitSet(16); BitSet bits2 = new BitSet(16); //set some bits for(int i=0; i<16; i++) { if((i%2) == 0) bits1.set(i); if((i%5) != 0) bits2.set(i); } System.out.println("Initial pattern in bits1: "); System.out.println(bits1); System.out.println("Initial pattern in bits2: "); System.out.println(bits2); //AND bits bits2.and(bits1); System.out.println("bits2 AND bits1: "); System.out.println(bits2); //OR bits bits2.or(bits1); System.out.println("bits2 OR bits1: "); System.out.println(bits2); //XOR bits bits2.xor(bits1); System.out.println("bits2 XOR bits1: "); System.out.println(bits2); }}
実行結果:
エニュメレーションインタフェースは、それ自体がデータ構造に属していないが、他のデータ構造の範疇で広く応用されている.エニュメレーション(The Enumeration)インタフェースは、データ構造から連続要素を取り出す方法を定義します.例えば、列挙は、複数の要素を含むデータ構造の次の要素を得るためのnextElementという方法を定義します.
Enumerationインタフェースにはいくつかの方法が定義されています.これらの方法で列挙できるオブジェクトセット内の要素を一度に取得します.このような従来のインタフェースは反復器に置き換えられています.Enumerationはまだ破棄されていませんが、現代のコードではあまり使用されていません.それでも、VectorやPropertiesなどの従来のクラスで定義された方法で使用されています.それ以外にもいくつかのAPIクラスで使用されており、アプリケーションでも広く使用されています使用します.次の表では、Enumeration宣言の方法をまとめます.
シーケンス番号
メソッドの説明
1
boolean hasMoreElements()は、この列挙により多くの要素が含まれているかどうかをテストします.
2
Object nextElement()この列挙オブジェクトに少なくとも1つの提供可能な要素がある場合、この列挙の次の要素が返されます.
次の例では、Enumerationの使用方法を示します.
import java.util.Vector;import java.util.Enumeration; public class EnumerationTester { public static void main(String args[]) { Enumeration days; Vector dayNames = new Vector(); dayNames.add("Sunday"); dayNames.add("Monday"); dayNames.add("Tuesday"); dayNames.add("Wednesday"); dayNames.add("Thursday"); dayNames.add("Friday"); dayNames.add("Saturday"); days = dayNames.elements(); while (days.hasMoreElements()){ System.out.println(days.nextElement()); } }}
実行結果:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
次に、下位集合(BitSet)を見てみましょう.ビット集合クラスは、個別に設定および消去できるビットまたはフラグのセットを実現します.このクラスは、ブール値のセットを処理するときに非常に役立ちます.各値に「ビット」を割り当て、ビットを適切に設定またはクリアするだけで、ブール値を操作できます.
Bitsetクラスは、ビット値を保存するための特殊なタイプの配列を作成します.BitSetの配列サイズは必要に応じて大きくなります.これはビットベクトル(vector of bits)と似ています.これは従来のクラスですが、Java 2で完全に再設計されています.BitSetは2つの構築方法を定義し、最初の構築方法はデフォルトのオブジェクトを作成します.
BitSet()
2つ目の方法では、ユーザーが初期サイズを指定できます.すべてのビットを0に初期化:
BitSet(int size)
BitSetでCloneableインタフェースで定義されているメソッドは、次の表に示されています.
シーケンス番号
メソッドの説明
1
void and(BitSet set)は、このターゲットビットsetおよびパラメータビットsetに対して論理および動作を実行する.
2
void andNot(BitSet set)は、指定したBitSetで設定されている対応するビットをすべて消去します.
3
int cardinality()は、BitSetでtrueに設定されているビット数を返します.
4
void clear()このBitSetのすべてのビットをfalseに設定します.
5
void clear(int index)は、インデックス指定のビットをfalseに設定します.
6
void clear(int startIndex,int endIndex)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)の範囲内のビットをfalseに設定します.
7
Object clone()このBitSetをコピーし、それに等しい新しいBitSetを生成します.
8
boolean equals(Object bitSet)このオブジェクトを指定したオブジェクトと比較します.
9
void flip(int index)は、指定したインデックスのビットを現在の値の符号化に設定します.
10
void flip(int startIndex,int endIndex)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)の範囲内の各ビットに対して、現在値の補符号を設定する.
11
boolean get(int index)は、指定したインデックスのビット値を返します.
12
BitSet get(int startIndex,int endIndex)は、BitSet内のfromIndex(含む)からtoIndex(含まない)までの範囲のビット組成を返す新しいBitSetを返す.
13
int hashCode()は、このビットsetのハッシュコード値を返す.
14
boolean intersects(BitSet bitSet)指定されたBitSetにtrueに設定されたビットがあり、このBitSetにおいてもtrueに設定されている場合は、tureに戻ります.
15
boolean isEmpty()このBitSetにtrueに設定されたビットが含まれていない場合は、tureに戻ります.
16
int length()は、このBitSetの論理サイズを返します.BitSetの最高設定ビットのインデックスに1を追加します.
17
int nextClearBit(int startIndex)は、指定された開始インデックスまたはその後のインデックスで発生するfalseに設定された最初のビットのインデックスを返します.
18
int nextSetBit(int startIndex)は、指定された開始インデックスまたはその後のインデックスに発生する最初のtrueに設定されたビットのインデックスを返します.
19
void or(BitSet bitSet)はこのビットsetとビットsetパラメータに対して論理または操作を実行する.
20
void set(int index)は、指定したインデックスのビットをtrueに設定します.
21
void set(int index,boolean v)は、指定したインデックスのビットを指定した値に設定します.
22
void set(int startIndex,int endIndex)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)の範囲内のビットをtrueに設定します.
23
void set(int startIndex,int endIndex,boolean v)は、指定されたfromIndex(含む)から指定されたtoIndex(含まない)までの範囲内のビットを指定された値に設定します.
24
int size()このBitSetがビット値を表すときに実際に使用するスペースのビット数を返します.
25
String toString()は、このビットsetの文字列表現形式を返します.
26
void xor(BitSet bitSet)は、このビットsetおよびビットsetパラメータに対して論理的または動作を実行する.
次のプログラムでは、このデータ構造がサポートするいくつかの方法を説明します.
import java.util.BitSet; public class BitSetDemo { public static void main(String args[]) { BitSet bits1 = new BitSet(16); BitSet bits2 = new BitSet(16); //set some bits for(int i=0; i<16; i++) { if((i%2) == 0) bits1.set(i); if((i%5) != 0) bits2.set(i); } System.out.println("Initial pattern in bits1: "); System.out.println(bits1); System.out.println("Initial pattern in bits2: "); System.out.println(bits2); //AND bits bits2.and(bits1); System.out.println("bits2 AND bits1: "); System.out.println(bits2); //OR bits bits2.or(bits1); System.out.println("bits2 OR bits1: "); System.out.println(bits2); //XOR bits bits2.xor(bits1); System.out.println("bits2 XOR bits1: "); System.out.println(bits2); }}
実行結果:
Initial pattern in bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
Initial pattern in bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
bits2 AND bits1:
{2, 4, 6, 8, 12, 14}
bits2 OR bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
bits2 XOR bits1:
{}
よし、今回はここまでですが、後続のデータ構造は後の記事に記録されます.いい感じだったら、応援よろしくね..