連想配列

    • .keysプロパティは、連想配列のすべてのキーを含むスライス(つまり動的配列)を返す。このスライスを反復処理し、.removeを呼び出して各キーの要素を削除すると、空の連想配列になる。
      import std.stdio;
      
      void main() {
          string[int] names =
          [
              1   : "one",
              10  : "ten",
              100 : "hundred",
          ];
      
          writeln("Initial length: ", names.length);
      
          int[] keys = names.keys;
      
          /* 'foreach'は'for'と似ているが、より優れている。
           * 'foreach'ループについては、次の章で説明する。 */
          foreach (key; keys) {
              writefln("Removing the element %s", key);
              names.remove(key);
          }
      
          writeln("Final length: ", names.length);
      }
      D
      aa.solution.1

      この解決策は、特に大規模な配列の場合、処理が遅くなる可能性がある。次のメソッドを使用すると、配列を1つのステップで空にすることができる。

    • 別の解決策は、空の配列を代入することだ。
      string[int] emptyAA;
      names = emptyAA;
      D
    • 配列の初期値はいずれにせよ空の配列なので、次の手法でも同じ結果になる。
      names = names.init;
      D
  1. 目標は、1人の学生につき複数の成績を格納することだ。動的配列には複数の成績を格納できるため、stringからint[]へのマッピングを行う連想配列がここで使える。成績は、連想配列に格納されている動的配列に追加できる:
    import std.stdio;
    
    void main() {
        /* この連想配列のキーの型は文字列で、
         * 値の型はint[]、つまりintの配列である。
         * 連想配列は、値の型を区別しやすくするために、
         * 間に余分なスペースを入れて定義されている。 */
        int[] [string] grades;
    
        /* "emre"に対応する整数配列は、
         * その配列に新しい成績を追加するために使用される: */
        grades["emre"] ~= 90;
        grades["emre"] ~= 85;
    
        /* "emre"の成績を表示: */
        writeln(grades["emre"]);
    }
    D
    aa.solution.2

    成績は、配列リテラルを使用して一度に割り当てることもできる:

    import std.stdio;
    
    void main() {
        int[][string] grades;
    
        grades["emre"] = [ 90, 85, 95 ];
    
        writeln(grades["emre"]);
    }
    D
    aa.solution.3