コンテンツにスキップ

コレクション

出典: フリー教科書『ウィキブックス(Wikibooks)』

プログラミングにおけるコレクションは、さまざまなプログラミング言語で共通して利用されます。

主なコレクションの種類としては、以下のようなものがあります:

  1. 配列(Array): 同じデータ型の要素を連続したメモリ領域に格納するデータ構造です。インデックスを使用して要素にアクセスできます。
  2. リスト(List): 順序付けられた要素のコレクションで、要素の追加、削除、および変更が可能です。各要素はインデックスで識別されます。
  3. セット(Set): 重複のない要素の集合です。順序は保証されません。主に集合演算(和集合、積集合、差集合など)に使用されます。
  4. マップ(Map)または辞書(Dictionary): キーと値のペアのコレクションです。キーを使用して値にアクセスします。キーは一意であり、重複は許されません。
  5. タプル(Tuple): 複数の要素を1つの単位として保持します。変更できない(不変)シーケンスです。
  6. キュー(Queue): 先入れ先出し(FIFO)のデータ構造です。要素の追加は一端に行い、削除はもう一方の端から行います。
  7. スタック(Stack): 後入れ先出し(LIFO)のデータ構造です。要素の追加と削除は同じ端から行います。

これらのコレクションは、プログラミング言語やライブラリによって名称や実装が異なる場合がありますが、一般的にデータを効率的に管理するために使用されます。

コレクション・反復とループ[編集]

コレクションと反復(iteration)・ループ(loop)には密接な関係がありますが、それぞれ異なる概念です。

  1. コレクション(Collection):
    コレクションは、複数の要素を1つのまとまりとして扱うデータ構造です。リスト、セット、マップなどがその例です。
    コレクションはデータをグループ化するために使用され、一般的にデータを格納、操作、管理するための手段として機能します。
  2. 反復(Iteration):
    反復は、コレクション内の各要素に順番にアクセスするプロセスです。このプロセスは、各要素を取り出して何らかの処理を行うために使用されます。
    反復は通常、ループ構造を使用して実装されます。各反復ステップで、次の要素が処理されます。
  3. ループ(Loop):
    ループは、一連の命令やステートメントを繰り返し実行する制御構造です。これにより、同じ操作を複数の要素に対して繰り返し実行できます。

反復がコレクションの要素を処理するための手段であるのに対し、ループはプログラムの制御構造を表します。

コレクションはデータをグループ化するための仕組みであり、反復はそのコレクション内の要素を処理するための手段です。そして、反復は通常、ループ構造を使用して実装されます。ループは、プログラムの特定の部分を繰り返し実行するための制御構造です。

iteratorパターンと様々なプログラミング言語での反復支援機構[編集]

Iteratorパターンは、コレクションの内部構造を隠し、要素に順番にアクセスするための方法を提供します。これにより、コレクションの実装の詳細を隠蔽し、反復処理のコードとコレクションのコードを分離することができます。

さまざまなプログラミング言語で、Iteratorパターンをサポートするための反復支援機構が提供されています。これらの機構には、イテレータプロトコル、ジェネレータ、または組み込みの反復機能が含まれます。以下に、いくつかの主要なプログラミング言語とその反復サポート機構を示します。

  1. Ruby Rubyでは、Iteratorパターンを実装するためのイテレータや反復処理の機構が組み込まれています。具体的には、eachメソッドやEnumerableモジュールが使用されます。
    1. eachメソッド: ほとんどのコレクション型(配列、ハッシュ、セットなど)は、eachメソッドを持っています。このメソッドは、ブロックを受け取り、コレクション内の各要素に対してブロック内の処理を実行します。
      numbers = [1, 2, 3, 4, 5]
      numbers.each do |number|
          puts number
      end
      
    2. Enumerableモジュール: Enumerableモジュールは、反復可能なオブジェクトに対して豊富なメソッドを提供します。これにより、配列やハッシュなどのコレクションをシームレスに操作できます。
      class MyEnumerable
        include Enumerable
        
        def initialize(n) = @n = n
      
        def each(&block)
          @n.times{|i| yield i }
        end
      end
      
      # イテレータの使用
      my_enumerable = MyEnumerable.new(5)
      
      p my_enumerable.to_a # [0, 1, 2, 3, 4]
      
      for item in my_enumerable
          puts(item)
      end
      # 0
      # 1
      # 2
      # 3
      # 4
      
    RubyのIteratorパターンは、イテレータや反復処理の機構を簡潔に表現し、コードをより読みやすく、効果的にします。また、eachメソッドやEnumerableモジュールを活用することで、繰り返し処理を容易に実装できます。
  2. JavaScript JavaScriptにおいても、Iteratorパターンを実装する方法が提供されています。主な方法として、ジェネレータやSymbol.iteratorプロトコルがあります。
    1. ジェネレータ(Generator): ジェネレータは、イテレータオブジェクトを生成するための特別な関数です。function*キーワードを使用して定義され、yieldキーワードを使って途中で値を返すことができます。
      function* generateNumbers() {
          yield 1;
          yield 2;
          yield 3;
      }
      
      const iterator = generateNumbers();
      for (let number of iterator) {
          console.log(number);
      }
      
    2. Symbol.iteratorプロトコル: Symbol.iteratorは、オブジェクトに反復可能な振る舞いを提供するためのプロトコルです。オブジェクトがこのプロトコルを実装することで、for...ofループやArray.from()などの反復処理メソッドで使用することができます。
      const myIterable = {
          [Symbol.iterator]: function* () {
              yield 'hello';
              yield 'world';
          }
      };
      
      for (let item of myIterable) {
          console.log(item);
      }
      
    これらの方法を使用することで、JavaScriptでIteratorパターンを実装し、コレクションを反復処理することができます。
  3. Python: Pythonでは、Iteratorパターンを実装するためのイテレータプロトコルがあります。これは、__iter__()__next__()の2つのメソッドを実装することで、自分自身を反復処理可能なオブジェクトにするものです。また、ジェネレータと呼ばれる特別な関数や式も使用できます。
    class MyIterator:
        def __init__(self, data):
            self.data = data
            self.index = 0
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.index >= len(self.data):
                raise StopIteration
            result = self.data[self.index]
            self.index += 1
            return result
    
    # イテレータの使用
    my_iterator = MyIterator([1, 2, 3])
    for item in my_iterator:
        print(item)
    
  4. Java: Javaでは、IteratorインタフェースがIteratorパターンを実装するためのメカニズムです。Javaのコレクションフレームワークは、すべてのコレクションに対してiterator()メソッドを提供し、Iteratorオブジェクトを取得できます。
    // イテレータの使用
    List<Integer> numbers = Arrays.asList(1, 2, 3);
    Iterator<Integer> iterator = numbers.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
    
  5. C#: C#では、IEnumerableインターフェースとIEnumeratorインターフェースがIteratorパターンを実装するためのメカニズムです。IEnumerableはコレクションを反復処理可能なものにし、IEnumeratorは反復処理の実際のメカニズムを提供します。
    // イテレータの使用
    List<int> numbers = new List<int> { 1, 2, 3 };
    IEnumerator<int> enumerator = numbers.GetEnumerator();
    while (enumerator.MoveNext()) {
        Console.WriteLine(enumerator.Current);
    }
    

これらの例は、それぞれの言語でIteratorパターンを使用する方法を示しています。Iteratorパターンは、異なるプログラミング言語やフレームワークで異なる形で実装されることがありますが、一般的な原則は同じです。