Powered by SmartDoc

コレクションクラス

Foundationフレームワーク

Javaの標準ライブラリには豊富なコレクションクラスが用意されていますが、WebObjectsはそれとは別に専用のコレクションクラスを持っています。このコレクションクラスは、WebObjectsがObjective-Cで実装されていたバージョンで使われていた標準ライブラリの一部でした。この標準ライブラリはFoundationフレームワークと呼ばれ、現在のWebObjectsがObjective-CからJavaで実装し直される際に、Foundationフレームワークの一部もcom.webobjects.foundationパッケージとして移植されました。

元々が標準ライブラリですから、FoundationフレームワークにはJavaの標準ライブラリとかぶっている機能があります。特にコレクションクラスについては、わざわざ標準と異なるクラスを使うのに違和感を持たれる方もいると思います。しかし、WebObjectsのコレクションはたかだか3つほどしかなく、すぐに覚えられるでしょう。

標準コレクションクラスとの互換性

いずれのコレクションクラスも、Javaの標準コレクションクラスのインターフェースを実装しています。WebObjectsのメソッドの命名規則は普通のJavaライブラリとはだいぶ異なるので、慣れなければ標準コレクションクラスのインターフェースを使っても構いません。

命名規則

Foundationフレームワークを含め、WebObjectsのメソッド名には簡単な規則があります。この規則を知っておくと、APIリファレンスからメソッドを探しやすくなります。

可変性

コレクションクラスを含むFoundationフレームワークのクラスには、インスタンスの生成後に内容を変更できるサブクラスを持つものがあります。内容を変更できるクラスには、すべて「Mutable」の名前がついています。

例えば配列クラスのNSArrayではコンストラクタでしか配列の要素を決められず、インスタンスの生成後に要素を変更することはできません。インスタンスの生成後も要素を変更できる配列クラスには、NSMutableArrayが用意されています。NSMutableArrayはNSArrayのサブクラスで、可変であること以外はNSArrayと同じです。

可変・不変のどちらも、パフォーマンスにほとんど違いはありません。メソッドの引数や戻り値に可変・不変なクラスを指定する場合は、メソッド内・終了後に変更される可能性がない限り、不変なクラスを指定するといいでしょう。

NSArray/NSMutableArray

NSArray/NSMutableArrayは配列のクラスです。WebObjectsの中でも最も多く使われています。NSArray/NSMutableArrayはJavaの標準ライブラリだとArrayListにあたり、java.util.Listインターフェースを実装しています。どちらのクラスのインスタンスも要素にnullを持てないことに注意してください。

NSArrayのインスタンスは、生成後に要素を追加したり削除することはできません。あとから要素を変更したい場合はNSMutableArrayクラスを使ってください。

ここでは主なメソッドについて説明します。詳しい情報はAPIリファレンスを参照してください。

配列の生成

NSArray/NSMutableArray()
空の配列を生成します。
NSMutableArray(int capacity)
引数で指定した数の要素を持てるだけのメモリを確保した空の配列を生成します。(NSMutableArrayのみ)
NSArray/NSMutableArray(Object object)
引数のオブジェクトを要素に持つ配列を生成します。
NSArray/NSMutableArray(Object[] objects)
引数の配列の要素を持つ配列を生成します。
NSArray/NSMutableArray(NSArray otherArray)
引数の配列の要素を持つ配列を生成します。
NSArray(List list, boolean checkForNull)
引数のリストの要素を持つ配列を生成します。checkForNullが真であれば、リストに含まれるnullを無視します。偽であれば、リストにnullが含まれていると例外IllegalArgumentExceptionを発生します。(NSArrayのみ)

配列へのアクセス

int count()
要素の数を返します。
boolean containsObject(Object object)
引数のオブジェクトが要素に含まれていれば真を返します。
Object objectAtIndex(int index)
引数のインデックスの要素を返します。
int indexOfObject(Object object)
引数のオブジェクトのインデックスを返します。
Object lastObject()
最後の要素を返します。
Object[] objects()
要素の配列を返します。
boolean isEmpty()
要素も一つも持っていなければ真を返します。
Enumeration objectEnumerator()
要素を順に繰り返すEnumerationオブジェクトを返します。
Enumeration reverseObjectEnumerator()
要素を逆順に繰り返すEnumerationオブジェクトを返します。

要素の追加

NSArray arrayByAddingObject(Object object)
引数のオブジェクトを追加した新しい配列を返します。
NSArray arrayByAddingObjectsFromArray(NSArray otherArray)
引数の配列の要素を追加した新しい配列を返します。

要素の追加と削除 (NSMutableArray)

void addObject(Object object)
引数のオブジェクトを要素に追加します。引数はnull以外でなければいけません。
void addObjects(Object[] objects)
引数のオブジェクトの配列を要素に追加します。配列にnullが含まれていてはいけません。
void addObjectsFromArray(NSArray otherArray)
引数の配列の要素を自身の要素に追加します。
void insertObjectAtIndex(Object object, int index)
引数のインデックスにオブジェクトを挿入します。引数のインデックス以降の要素は一つ後ろにずれます。
void removeAllObjects()
すべての要素を削除します。
Object removeLastObject()
最後のインデックスの要素を削除します。
boolean removeObject(Object object)
引数のオブジェクトが要素にあれば削除します。
Object removeObjectAtIndex(int index)
引数のインデックスの要素を削除します。引数のインデックス以降の要素は一つ前にずれます。
void removeObjects(Object[] objects)
引数のオブジェクトの配列の各要素が自身の要素にあれば削除します。
void removeObjectsInArray(NSArray otherArray)
引数の配列の各要素が自身の要素にあれば削除します。
Object replaceObjectAtIndex(Object object, int index)
引数のインデックスの要素を、引数のオブジェクトに置き換えます。
void setArray(NSArray otherArray)
すべての要素を引数の配列の要素に入れ替えます。

ソート

配列をソートするには、NSComparatorという比較方法の情報を持つオブジェクトを使います。NSComparartorオブジェクトは次のNSComparatorのクラスメソッドで取得できます(表6.2.5.1[NSComparatorオブジェクトを取得できるメソッド])。

NSComparatorオブジェクトを取得できるメソッド
クラスメソッド(NSComparator) 内容
AscendingStringComparator 文字列を比較し、昇順にソートします。大文字小文字を区別します。
DesscendingStringComparator 文字列を比較し、降順にソートします。大文字小文字を区別します。
AscendingCaseInsensitiveStringComparator 文字列を比較し、昇順にソートします。大文字小文字を区別しません。
DesscendingCaseInsensitiveStringComparator 文字列を比較し、降順にソートします。大文字小文字を区別しません。
AscendingNumberComparator Numberオブジェクトを比較し、昇順にソートします。
DescendingNumberComparator Numberオブジェクトを比較し、降順にソートします。
AscendingTimestampComparator NSTimestampオブジェクトを比較し、昇順にソートします。
DescendingTimestampComparator NSTimestampオブジェクトを比較し、降順にソートします。
NSArray sortedArrayUsingComparator(NSComparator comparator)
引数の比較方法でソートした配列を返します。
void sortUsingComparator(NSComparator comparator)
引数の比較方法で配列をソートします。(NSMutableArrayのみ)

可変・不変な配列の生成

NSMutableArray mutableClone()
配列をNSMutableArrayに変換して返します。
NSArray immutableClone()
配列をNSArrayに変換して返します。

文字列要素の操作

String componentsJoinedByString(String separator)
配列の各要素を文字列に変換し、それを引数の文字列で連結した文字列を返します。
static NSArray componentsSeparatedByString(String string, String separator)
separatorを区切りとしてstringを分割し、分割したそれぞれの文字列を要素とする配列を返します。

Key-Value Coding

Key-Value Codingとは、オブジェクトの内容にキーでアクセスできるメソッドを持つインターフェースです。キーに対応する値を取得するvalueForKey()と、キーに対応する値をセットするtakeValueForKey()の二つのメソッドがあります。この章ではKey-Value Codingについて詳しく説明しません。

NSArray/NSMutableArrayは、キーパスという複数のキーを連結させた文字列を解釈するvalueForKeyPath()takeValueForKeyPath()を上記のメソッドに加えて実装しています。NSArray/NSMutableArrayのvalueForKeyPath()は特殊な使い方ができるので、次の節で説明します。

Object valueForKey(String key)
すべての要素にvalueForKey()を実行した結果を配列で返します。
void takeValueForKey(Object value, String key)
すべての要素にtakeValueForKey()を実行します。
void takeValueForKeyPath(Object value, String keyPath)
すべての要素にtakeValueForKeyPath()を実行します。

すべての要素への操作

NSArray/NSMutableArrayのKey-Value CodingメソッドのうちvalueForKeyPath()では、すべての要素に対して特殊な操作を行うことができます(以降、この操作のことを「オペレータ」と呼びます)。キーパスでオペレータを指定するには、キーの先頭を"@"にします。いくつかの例を次に示します。

オペレータは、あらかじめ次のものが定義されています(表6.2.9.1[デフォルトのオペレータ])。

デフォルトのオペレータ
オペレータ 内容
count 配列の要素の数を返します。
max すべての要素のうち最大値を返します。
min すべての要素のうち最小値を返します。
avg すべての要素の平均値を返します。
sum すべての要素の合計値を返します。
Object valueForKeyPath(String keyPath)
すべての要素にvalueForKey()を実行した結果を配列で返します。ただし、キーが"@"で始まっていればオペレータとみなし、続くキーのすべて値(valueForKey()の実行結果)の配列に対して操作を行います。
static NSArray operatorNames()
定義されているすべてのオペレータ名を返します。
static NSArray.Operator operatorForKey(String operatorName)
引数のオペレータを実装しているオブジェクトを返します。
static void setOperatorForKey(String operatorName, NSArray.Operator arrayOperator)
operatorNameを名前としてオペレータを登録します。arrayOperatorはNSArray.Operatorインターフェースを実装している必要があります。

オペレータの実装

valueForKeyPath()で使うオペレータを実装するには、NSArray.Operatorインターフェースを実装したクラスのインスタンスを、NSArray.setOperatorForKey()で登録します。

ランダムに要素を一つ返すanyオペレータを実装してみましょう。NSArray.Operatorインターフェースを実装したAnyOperatorクラスを定義します。

import com.webobjects.foundation.*;
import java.util.Random;

public class AnyOperator implements NSArray.Operator {

    AnyOperator() {}
  
    public Object compute(NSArray values, String keyPath) {
        Random rand = new Random();
        int i = rand.nextInt(values.count());
        return values.objectAtIndex(i);
    }

}

次に、Applicationのコンストラクタでオペレータを登録します。

public class Application extends WOApplication {
    
    public static void main(String argv[]) {
        WOApplication.main(argv, Application.class);
    }

    public Application() {
        super();
        System.out.println("Welcome to " + this.name() + "!");
        
        /* ** Put your application initialization code here ** */
        NSArray.setOperatorForKey("any", new AnyOperator());
    }

}

これでanyオペレータを使えるようになります。valueForKeyPath()で"@any"とキーを指定すると、配列の要素からランダムに要素を取り出すことができます。

NSDictionary/NSMutableDictionary

NSDictionary/NSMutableDictionaryは辞書のクラスです。Javaの標準ライブラリではHashMapにあたり、java.util.Mapインターフェースを実装しています。どちらのクラスのインスタンスも、キーと値の双方にnullを持てないことに注意してください。

NSDictionaryのインスタンスは、生成後にエントリを追加したり削除することはできません。あとからエントリを変更したい場合はNSMutableDictionaryクラスを使ってください。

ここでは主なメソッドについて説明します。より詳しい情報はAPIリファレンスを参照してください。

辞書の生成

NSDictionary/NSMutableDictionary()
空の辞書を生成します。
NSDictionary/NSMutableDictionary(Dictionary dictionary, boolean ignoreNull)
引数の辞書のエントリを持つ辞書を生成します。ignoreNullが真であればキーか値がnullであった場合に無視し、偽であれば例外を発生します。
NSMutableDictionary(int capacity)
引数で指定した数のエントリを持てるだけのメモリを確保した空の辞書を生成します。(NSMutableDictionaryのみ)
NSDictionary/NSMutableDictionary(Object object, Object key)
keyをキー、objectを値とするエントリを持つ辞書を生成します。
NSDictionary/NSMutableDictionary(NSDictionary otherDictionary)
引数の辞書のエントリを持つ辞書を生成します。
NSDictionary/NSMutableDictionary(NSArray objects, NSArray keys)
keysをキーの配列、objectsを値の配列とし、それぞれの配列を順にエントリとした辞書を生成します。
NSDictionary/NSMutableDictionary(Object[] objects, Object[] keys)
keysをキーの配列、objectsを値の配列とし、それぞれの配列を順にエントリとした辞書を生成します。
NSDictionary(Map map, boolean ignoreNull)
引数の辞書のエントリを持つ辞書生成します。ignoreNullが真であれば、いずれかのエントリのキーか値がnullであった場合に無視し、偽であれば例外を発生します。

辞書へのアクセス

Object objectForKey(Object key)
引数のキーに対応する値を返します。
NSArray objectsForKeys(NSArray keys, Object notFoundMarker)
引数の配列の各要素をキーとし、それぞれのキーに対応する値を配列で返します。辞書にキーがなければnotFoundMarkerを値として配列に含めます。
NSArray allKeys()
すべてのキーを返します。
NSArray allValues()
すべての値を返します。
boolean containsKey(Object key)
引数のキーが辞書のキーにあれば真を返します。
boolean containsValue(Object value)
引数の値が辞書の値にあれば真を返します。
int count()
エントリの数を返します。
boolean isEmpty()
エントリを一つも持っていなければ真を返します。
Enumeration keyEnumerator()
各キーを取得するEnumerationオブジェクトを返します。
Enumeration objectEnumerator()
各値を取得するEnumerationオブジェクトを返します。

エントリの追加と削除 (NSMutableDictionary)

void setObjectForKey(Object object, Object key)
keyをキー、objectを値として辞書のエントリに追加します。
void addEntriesFromDictionary(NSDictionary otherDictionary)
引数の辞書のエントリを自身のエントリに追加します。
Object removeObjectForKey(Object key)
引数のキーに対応する値があれば、そのエントリを削除します。
void removeObjectsForKeys(NSArray keys)
引数の配列の各要素をキーとし、それぞれのキーに対応する値があれば、そのエントリをすべて削除します。
void removeAllObjects()
すべてのエントリを削除します。
void setDictionary(NSDictionary otherDictionary)
すべてのエントリを引数の辞書のエントリに入れ替えます。

可変・不変な辞書の生成

NSDictionary immutableClone()
辞書をNSDictionaryに変換して返します。
NSMutableDictionary mutableClone()
辞書をNSMutableDictionaryに変換して返します。

NSSet/NSMutableSet

NSSet/NSMutableSetはセットのクラスです。Javaの標準ライブラリだとHashSetにあたり、java.util.Setインターフェースを実装しています。どちらのクラスのインスタンスも要素にnullを持てないことに注意してください。

NSSetのインスタンスは、生成後に要素を追加したり削除することはできません。あとから要素を変更したい場合はNSMutableSetクラスを使ってください。

ここでは主なメソッドについて説明します。より詳しい情報はAPIリファレンスを参照してください。

セットの生成

NSSet/NSMutableSet()
空のセットを生成します。
NSMutableSet(int capacity)
引数で指定した数の要素を持てるだけのメモリを確保した空のセットを生成します。(NSMutableSetのみ)
NSSet/NSMutableSet(Object object)
引数のオブジェクトを要素に持つセットを生成します。
NSSet/NSMutableSet(NSArray objects)
引数の配列の要素を持つセットを生成します。
NSSet/NSMutableSet(NSSet otherSet)
引数のセットの要素を持つセットを生成します。
NSSet/NSMutableSet(Object[] objects)
引数の配列の要素を持つセットを生成します。
NSSet(Set set, boolean ignoreNull)
引数のセットの要素を持つセットを生成します。ignoreNullが真であればいずれかの要素がnullであった場合に無視し、偽であれば例外を発生します。

セットへのアクセス

NSArray allObjects()
すべての要素を返します。
Object anyObject()
いずれかの要素を返します。
boolean containsObject(Object object)
引数のオブジェクトが要素にあれば真を返します。
int count()
要素の数を返します。
boolean isEmpty()
要素も一つも持っていなければ真を返します。
Enumeration objectEnumerator()
要素を順に繰り返すEnumerationオブジェクトを返します。

要素の追加と削除 (NSMutableSet)

void addObject(Object object)
引数のオブジェクトを要素に追加します。引数はnull以外でなければいけません。
void addObjectsFromArray(NSArray array)
引数の配列の要素を自身の要素に追加します。
void removeAllObjects()
すべての要素を削除します。
Object removeObject(Object object)
引数のオブジェクトが要素にあれば削除します。
void setSet(NSSet otherSet)
すべての要素を引数のセットの要素に入れ替えます。

比較

boolean isSubsetOfSet(NSSet otherSet)
セットの要素がすべて引数のセットに含まれていれば真を返します。
boolean intersectsSet(NSSet otherSet)
セットの要素が一つでも引数のセットに含まれていれば真を返します。

合成

NSSet setByIntersectingSet(NSSet otherSet)
自身と引数のセットで共通する要素をまとめたセットを返します。
NSSet setBySubtractingSet(NSSet otherSet)
自身にあって引数のセットにない要素をまとめたセットを返します。
NSSet setByUnioningSet(NSSet otherSet)
自身と引数のセットの両方の要素をまとめたセットを返します。

再合成 (NSMutableSet)

void intersectSet(NSSet otherSet)
自身と引数のセットに共通しない要素を削除します。
void subtractSet(NSSet otherSet)
自身と引数のセットに共通する要素を削除します。
void unionSet(NSSet otherSet)
自身にない引数のセットの要素を追加します。

可変・不変なセットの生成

NSSet immutableClone()
セットをNSSetに変換して返します。
NSMutableSet mutableClone()
セットをNSMutableSetに変換して返します。