Classiclll's Blog

an old boy

Collection is an object - オブジェクトの便利な格納場所

Collection is an object - オブジェクトの便利な格納場所
(最近,ロジックをこねくりまわす時間が連続して取れないので)

前記事のClass is an object!を読んでくれているものとして、そのノリで話を進める。

其の零 承前

コレクション(Collection)っていう語感は、「(興味の対象である)【ある種類】に属するモノばかりを集めた」モノ(=【値】)。Javaのクラス*のひとつ、Collectionも全く同じ語感。だから、Collectionの【オブジェクト=値】は【あるクラス=種類】のモノを複数格納できる。
(*正確にはインターフェース ー 違いはここでは説明しない)

ただ、モノを出し入れするための操作(=メソッド)がなければ、格納するだけの役にも立たないブラックホール。だから操作は【ある】。だけど、入れる種類、目的によって必要な操作は違うかもしれない(後述)。

Webで「コレクション(+ Java)」を検索すれば、多種多様な解説が得られるので、あなたの好みのページで理解されるのが吉。ここでは、できるだけ直感的(と、いうことは不正確でぶっきらぼうな)解説を試みる。ここで理解した気になってくれた人が少しでもいてくれたらHappy。

其の壱 コレクションの操作

役に立つために用意されている操作は以下。(反復子はコレクションを操作するための【安全な】クラス)コレクションの派生系列に関しては原則として共通事項。なので、この後解説するSet,List,Mapには原則として以下のメソッドは装備されている。
 int size()          コレクションの要素数を返します。
 boolean contains(Object o)  指定された要素がある場合に true
 boolean isEmpty()      要素がない場合に true
 boolean add(Object o)    指定された要素を格納する
 boolean remove(Object o)   指定された要素が格納されていれば除く
 void clear()         すべての要素を削除
 Iterator iterator()     コレクションの要素の【反復子】を返す
 【返された反復子の操作】
  boolean hasNext()        次の(コレクションの)要素がある場合に true
  Object next()         次の(コレクションの)要素を返す。
  void remove()          最後に返された要素を(コレクションから)除く
 Object[] toArray()      すべての要素が格納されている新しい配列を返す

【以下は、たまに使う操作】
 boolean containsAll(Collection c) 指定のコレクションのすべての要素がある場合に true
 boolean equals(Object o)
           指定されたオブジェクトとこのコレクションが等しいかどうかを比較
 boolean addAll(Collection c)    指定されたコレクションのすべての要素を追加
 int hashCode()           コレクションのハッシュコード値を返す。
 boolean removeAll(Collection c)   指定のコレクションに格納されている要素すべてを除く
 boolean retainAll(Collection c)
            指定のコレクションに格納されている要素だけを残し他は除く
 Object[] toArray(Object[] a)
            このコレクション内のすべての要素を配列に保持してその配列を返す

其の弐 集合(Set)

コレクションの一種。【同じ】要素は一個しか格納されない。なので、既に格納されている【値】を格納しようとすると怒られる。
これ以外はコレクションと同じ。

操作はコレクションと同じだけど、集合(Set)なので、
【集合演算】
 int size()              #(S)   Cardinal Number
 boolean contains(Object o)      o∈S?
 boolean isEmpty()          S=Φ?
 boolean containsAll(Collection c)  S⊇C?
 boolean equals(Object o)       S=o?
 boolean add(Object o)        S←S∪{o}
 boolean remove(Object o)      S←S∩(¬{o})
 void clear()            S←Φ
 boolean addAll(Collection c)     S←S∪C
 boolean removeAll(Collection c)    S←S∩(¬C)
 boolean retainAll(Collection c)   S←S∩C
 Iterator iterator()         ∀s∈S,・・・・

其の参 リスト(List)

これもコレクションの一種。格納された一連の値の【順序】を保証する。なので、序数(位置)を用いて格納された【値】を操作できるようになる。
Setではないので、値は重複しても良い。
 void add(int index, Object element)  指定された位置に、指定された要素を挿入
 Object get(int index)         指定された位置にある要素を返す。
 int indexOf(Object o)         指定された要素が最初に検出された位置を返す。
 ListIterator listIterator()      要素を適切な順序で繰り返し処理するリスト反復子を返す
 【リスト反復子の操作】
    void add(Object o)           指定された要素をリストに挿入する
    boolean hasPrevious()        【前に】要素を持っている場合に true
    int nextIndex()           【次の】要素のインデックスを返す
    Object previous()          【前の】要素を返す
    int previousIndex()         【前の】要素のインデックスを返す
    void remove()             この反復子が返した最後の要素を取り除く
    void set(Object o)          この反復子が返した最後の要素を指定された要素に置換
 Object remove(int index)       指定された位置にある要素を取り除く
 Object set(int index, Object element) 指定された位置にある要素を、指定された要素に置換

【以下は、たまに使う操作】
 boolean addAll(int index, Collection c)
      指定されたコレクション内のすべての要素を、指定された位置に挿入
 List subList(int fromIndex, int toIndex)
      fromIndex (含む) から toIndex (含まない) の範囲の部分のリストを返す
 ListIterator listIterator(int index)  指定された位置から開始する反復子を返す
 int lastIndexOf(Object o)       指定された要素が最後に検出された位置を返す

其の四 マップ(Map)

これもコレクションの一種。マップは、【順序】ではなく【キー】を用いて格納されている【値】を操作できる。原則として【順序】の概念は無い(順序を保証するタイプもある)。
そのかわり、格納するのは【キー】と【値】のペア。
 Object get(Object key)        指定のキーに結びついている値を返す。
 Object put(Object key, Object value) 指定された値と指定されたキーをこのマップに格納
 Object remove(Object key)      このキーにマッピングがあれば、それをマップから除く
 boolean containsKey(Object key)   指定のキーのマッピングが含まれている場合に true
 boolean containsValue(Object value) 指定の値を指すキーが(1以上)ある場合に true

【以下は、たまに使う操作】
 void putAll(Map t)     指定されたマップのすべてのマッピングをこのマップにコピー
 Set entrySet()       全てのマッピング(キーと値の組)を含むセットを返す。
 Set keySet()        全てのキーを含むセットを返す。
 Collection values()     全ての値のコレクションを返す。

例題はP5を使って各自で




Processing については、
日本語サポートサイトからたどれるP5インフォメーション→言語が参考になる。
(解説してあるのは一昔前の版だから注意が必要だけど、loop()→draw()の読み替えだけで大抵OK)
・山本徹(thoru)さんがFunProce55ingで解説してくれている。(【簡潔】で【わかり易く】、【楽しい】解説)
例題集は習作集と区別するためにこちらに置いている。
・P5のスケッチからアプレットを作り【ジオシティーズ】にアップする手順をまとめたので、参考に。