SizeSequence
オブジェクトは、サイズおよび対応する位置の、順序付けされたリストを効率的に維持します。 SizeSequence
の状況として適切な例としては、サイズが等しくない複数の行を表示するコンポーネントの場合があります。 この場合、単一のSizeSequence
オブジェクトを使って、すべての行の高さとY位置を追跡できます。
もう1つの例として、列サイズが等しくないJTable
などの複数列コンポーネントがあります。 JTable
は、単一のSizeSequence
オブジェクトを使ってすべての列の幅とX位置を格納できます。 続いてJTable
は、SizeSequence
オブジェクトを使って特定の位置に対応する列を見つけることができます。 1つまたは複数の列サイズが変更になったときにはいつでも、JTable
はSizeSequence
オブジェクトを更新できます。
次の図は、複数列コンポーネントのサイズと位置データの関係を示しています。
この図で、最初のインデックス(0)は最初の列に対応し、2番目のインデックス(1)は2番目の列に対応する、というようになっています。 最初の列の位置は0で始まり、この列はsize0ピクセルを占めます。size0はgetSize(0)
が返す値です。 したがって最初の列はsize0 - 1で終わります。 続いて2番目の列がsize0から始まり、size1(getSize(1)
) ピクセルを占めます。
SizeSequence
オブジェクトは単に軸に沿った間隔を表します。 上記の例では、間隔はピクセル単位の高さまたは幅を表しています。 しかし、一日のうちの時間など、ほかの測定単位も同じように有効です。
実装に関するノート
通常、エントリのサイズと位置を格納する際には、サイズの格納か、または位置の格納のどちらかを選びます。 描画中に必要な共通操作は、getIndex(position)
およびsetSize(index, size)
の2つです。 内部形式にどちらを選んでも、エントリ数が大きくなると2つの操作のどちらかは効率が悪くなります。 サイズを格納した場合、特定の位置を囲むエントリのインデックスの検索は、エントリ数に比例して時間がかかります。 逆に位置を格納した場合、特定のインデックスにあるエントリのサイズの設定は、影響を受けるエントリの位置を更新する必要があり、やはりエントリ数に比例して計算に時間がかかります。
前述の方法と同じく、このクラスは内部にN個の整数の配列を保持しますが、サイズベースの方法と位置ベースの方法の中間の、ハイブリッドなエンコーディングを使用します。 これによって、情報を格納するのに必要な空間は同じですが、ほとんどの操作をO(N)時間ではなくLog(N)時間で実行できるデータ構造となります。Nはリストにあるエントリ数です。
エントリ数のO(N)のまま残る操作は、insertEntries
メソッドとremoveEntries
メソッドの2つです。両メソッドとも、内部配列を整数サイズのセットに変換し、それを新しい配列にコピーし、そのあとハイブリッド表現を適切に修正することによって実装します。
- 導入されたバージョン:
- 1.3
-
コンストラクタのサマリー
コンストラクタ説明エントリを含まない新しいSizeSequence
オブジェクトを生成します。SizeSequence
(int numEntries) 指定された数のエントリを含む、新しいSizeSequence
オブジェクトを生成します。エントリはすべてサイズ0に初期化されています。SizeSequence
(int[] sizes) 指定されたサイズを含む新しいSizeSequence
オブジェクトを生成します。SizeSequence
(int numEntries, int value) 指定された数のエントリを含む、新しいSizeSequence
オブジェクトを生成します。エントリはすべてサイズvalue
に初期化されています。 -
メソッドのサマリー
修飾子と型メソッド説明int
getIndex
(int position) 指定された位置に対応するエントリのインデックスを返します。int
getPosition
(int index) 指定されたエントリの開始位置を返します。int
getSize
(int index) 指定されたエントリのサイズを返します。int[]
getSizes()
全エントリのサイズを返します。void
insertEntries
(int start, int length, int value) 連続するエントリのグループをこのSizeSequence
に追加します。void
removeEntries
(int start, int length) 連続するエントリのグループをこのSizeSequence
から削除します。void
setSize
(int index, int size) 指定されたエントリのサイズを設定します。void
setSizes
(int[] sizes) sizes
引数のデータを使って、このSizeSequence
オブジェクトをリセットします。
-
コンストラクタの詳細
-
SizeSequence
public SizeSequence()エントリを含まない新しいSizeSequence
オブジェクトを生成します。 エントリを登録するには、insertEntries
またはsetSizes
を使います。 -
SizeSequence
public SizeSequence(int numEntries) 指定された数のエントリを含む、新しいSizeSequence
オブジェクトを生成します。エントリはすべてサイズ0に初期化されています。- パラメータ:
numEntries
- 追跡するサイズの数- 例外:
NegativeArraySizeException
-numEntries < 0
の場合
-
SizeSequence
public SizeSequence(int numEntries, int value) 指定された数のエントリを含む、新しいSizeSequence
オブジェクトを生成します。エントリはすべてサイズvalue
に初期化されています。- パラメータ:
numEntries
- 追跡するサイズの数value
- 各サイズの初期値
-
SizeSequence
public SizeSequence(int[] sizes) 指定されたサイズを含む新しいSizeSequence
オブジェクトを生成します。- パラメータ:
sizes
-SizeSequence
に格納されるサイズの配列
-
-
メソッドの詳細
-
setSizes
public void setSizes(int[] sizes) sizes
引数のデータを使って、このSizeSequence
オブジェクトをリセットします。 このメソッドは、このオブジェクトがsizes
配列と同じだけのエントリを格納するよう初期化します。 各エントリのサイズは、sizes
の対応する項目の値に初期化されます。- パラメータ:
sizes
- このSizeSequence
に格納されるサイズの配列
-
getSizes
public int[] getSizes()全エントリのサイズを返します。- 戻り値:
- このオブジェクトのサイズを格納する新しい配列
-
getPosition
public int getPosition(int index) 指定されたエントリの開始位置を返します。 たとえば、getPosition(0)
は0を返し、getPosition(1)
はgetSize(0)
を、getPosition(2)
はgetSize(0)
+getSize(1)
を返します。index
がlength
より大きい場合、返される値は無意味です。- パラメータ:
index
- 位置が要求されているエントリのインデックス- 戻り値:
- 指定されたエントリの開始位置
-
getIndex
public int getIndex(int position) 指定された位置に対応するエントリのインデックスを返します。 たとえばgetIndex(0)
は0ですが、これは、最初のエントリはいつも位置0から始まるためです。- パラメータ:
position
- エントリの位置- 戻り値:
- 指定された位置を占めるエントリのインデックス
-
getSize
public int getSize(int index) 指定されたエントリのサイズを返します。index
が一定の範囲内(0 <= index < getSizes().length)
にない場合、動作は未確定です。- パラメータ:
index
- エントリに対応するインデックス- 戻り値:
- エントリのサイズ
-
setSize
public void setSize(int index, int size) 指定されたエントリのサイズを設定します。index
の値が一定の範囲内(0 <= index < getSizes().length)
にない場合、動作は未確定です。- パラメータ:
index
- エントリに対応するインデックスsize
- エントリのサイズ
-
insertEntries
public void insertEntries(int start, int length, int value) 連続するエントリのグループをこのSizeSequence
に追加します。start
とlength
の値は、(0 <= start < getSizes().length) AND (length >= 0)
の条件を満たす必要があります。 この条件を満たさない場合、動作が未確定なため、例外がスローされる場合があります。- パラメータ:
start
- グループ内の最初のエントリに割り当てられるインデックスlength
- グループのエントリ数value
- 新しい各エントリに割り当てるサイズ- 例外:
ArrayIndexOutOfBoundsException
- パラメータが次の範囲内にない場合: (0 <= start < (getSizes().length)) AND (length >= 0)
-
removeEntries
public void removeEntries(int start, int length) 連続するエントリのグループをこのSizeSequence
から削除します。start
とlength
の値は、(0 <= start < getSizes().length) AND (length >= 0)
の条件を満たす必要があります。 この条件を満たさない場合、動作が未確定なため、例外がスローされる場合があります。- パラメータ:
start
- 削除される最初のエントリのインデックスlength
- 削除されるエントリの数
-