Javaの標準ライブラリには豊富なコレクションクラスが用意されていますが、WebObjectsはそれとは別に専用のコレクションクラスを持っています。このコレクションクラスは、WebObjectsがObjective-Cで実装されていたバージョンで使われていた標準ライブラリの一部でした。この標準ライブラリはFoundationフレームワークと呼ばれ、現在のWebObjectsがObjective-CからJavaで実装し直される際に、Foundationフレームワークの一部もcom.webobjects.foundationパッケージとして移植されました。
元々が標準ライブラリですから、FoundationフレームワークにはJavaの標準ライブラリとかぶっている機能があります。特にコレクションクラスについては、わざわざ標準と異なるクラスを使うのに違和感を持たれる方もいると思います。しかし、WebObjectsのコレクションはたかだか3つほどしかなく、すぐに覚えられるでしょう。
いずれのコレクションクラスも、Javaの標準コレクションクラスのインターフェースを実装しています。WebObjectsのメソッドの命名規則は普通のJavaライブラリとはだいぶ異なるので、慣れなければ標準コレクションクラスのインターフェースを使っても構いません。
Foundationフレームワークを含め、WebObjectsのメソッド名には簡単な規則があります。この規則を知っておくと、APIリファレンスからメソッドを探しやすくなります。
getObject()
"とはならずに"object()
になります。
objectAtIndex()
"となります。
コレクションクラスを含むFoundationフレームワークのクラスには、インスタンスの生成後に内容を変更できるサブクラスを持つものがあります。内容を変更できるクラスには、すべて「Mutable」の名前がついています。
例えば配列クラスのNSArrayではコンストラクタでしか配列の要素を決められず、インスタンスの生成後に要素を変更することはできません。インスタンスの生成後も要素を変更できる配列クラスには、NSMutableArrayが用意されています。NSMutableArrayはNSArrayのサブクラスで、可変であること以外はNSArrayと同じです。
可変・不変のどちらも、パフォーマンスにほとんど違いはありません。メソッドの引数や戻り値に可変・不変なクラスを指定する場合は、メソッド内・終了後に変更される可能性がない限り、不変なクラスを指定するといいでしょう。
NSArray/NSMutableArrayは配列のクラスです。WebObjectsの中でも最も多く使われています。NSArray/NSMutableArrayはJavaの標準ライブラリだとArrayListにあたり、java.util.Listインターフェースを実装しています。どちらのクラスのインスタンスも要素にnullを持てないことに注意してください。
NSArrayのインスタンスは、生成後に要素を追加したり削除することはできません。あとから要素を変更したい場合はNSMutableArrayクラスを使ってください。
ここでは主なメソッドについて説明します。詳しい情報はAPIリファレンスを参照してください。
NSArray/NSMutableArray()
NSMutableArray(int capacity)
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 reverseObjectEnumerator()
NSArray arrayByAddingObject(Object object)
NSArray arrayByAddingObjectsFromArray(NSArray otherArray)
void addObject(Object object)
void addObjects(Object[] objects)
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) | 内容 |
---|---|
AscendingStringComparator |
文字列を比較し、昇順にソートします。大文字小文字を区別します。 |
DesscendingStringComparator |
文字列を比較し、降順にソートします。大文字小文字を区別します。 |
AscendingCaseInsensitiveStringComparator |
文字列を比較し、昇順にソートします。大文字小文字を区別しません。 |
DesscendingCaseInsensitiveStringComparator |
文字列を比較し、降順にソートします。大文字小文字を区別しません。 |
AscendingNumberComparator |
Numberオブジェクトを比較し、昇順にソートします。 |
DescendingNumberComparator |
Numberオブジェクトを比較し、降順にソートします。 |
AscendingTimestampComparator |
NSTimestampオブジェクトを比較し、昇順にソートします。 |
DescendingTimestampComparator |
NSTimestampオブジェクトを比較し、降順にソートします。 |
NSArray sortedArrayUsingComparator(NSComparator comparator)
void sortUsingComparator(NSComparator comparator)
NSMutableArray mutableClone()
NSArray immutableClone()
String componentsJoinedByString(String separator)
static NSArray componentsSeparatedByString(String string, String separator)
separator
を区切りとしてstring
を分割し、分割したそれぞれの文字列を要素とする配列を返します。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は辞書のクラスです。Javaの標準ライブラリではHashMapにあたり、java.util.Mapインターフェースを実装しています。どちらのクラスのインスタンスも、キーと値の双方にnullを持てないことに注意してください。
NSDictionaryのインスタンスは、生成後にエントリを追加したり削除することはできません。あとからエントリを変更したい場合はNSMutableDictionaryクラスを使ってください。
ここでは主なメソッドについて説明します。より詳しい情報はAPIリファレンスを参照してください。
NSDictionary/NSMutableDictionary()
NSDictionary/NSMutableDictionary(Dictionary dictionary, boolean ignoreNull)
ignoreNull
が真であればキーか値がnullであった場合に無視し、偽であれば例外を発生します。
NSMutableDictionary(int capacity)
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 objectEnumerator()
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()
NSMutableDictionary mutableClone()
NSSet/NSMutableSetはセットのクラスです。Javaの標準ライブラリだとHashSetにあたり、java.util.Setインターフェースを実装しています。どちらのクラスのインスタンスも要素にnullを持てないことに注意してください。
NSSetのインスタンスは、生成後に要素を追加したり削除することはできません。あとから要素を変更したい場合はNSMutableSetクラスを使ってください。
ここでは主なメソッドについて説明します。より詳しい情報はAPIリファレンスを参照してください。
NSSet/NSMutableSet()
NSMutableSet(int capacity)
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()
void addObject(Object object)
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)
void intersectSet(NSSet otherSet)
void subtractSet(NSSet otherSet)
void unionSet(NSSet otherSet)
NSSet immutableClone()
NSMutableSet mutableClone()