Index

HOME > プログラムTOP > JavaScript



配列の知識と技術(2)

  JavaScript の実用的な Tips です。配列に関する技術のうち、特殊な配列やソートなど、応用的な分野を掲載しています。
[INDEX] 二次元配列 :: 二次元配列のつくり方と使い方
連想配列 :: 添え字に文字列を指定する配列のつくり方と使い方
クイックソート :: クイックソートの原理と関数のサンプル
[ 配列の知識と技術(1) : 配列の作成 / 要素の追加と削除 / 連結と抽出 / 並べ替え]

sasaraan programming

Exposition

■二次元配列

 配列は、要素を配列にすることも可能です。要素が配列である配列を二次元配列と呼び、さらに要素の子要素が配列であれば三次元配列と呼びます。これらは、一般に、多次元配列と総称されます。この時、各要素には、[] を次元分だけ追記してアクセスすることが可能です。
// JavaScript Source
var a = new Array(3);
a[0] = new Array("D1", "D2", "D3", "D4");
a[1] = new Array("B1", "B2", "B3");
a[2] = new Array("C1", "C2", "C3", "C4", "C5");
a[0][0] = "D8";
a[1][1] = "B9";
a[2][4] = "C7";
var n;
n = a.length;                 // = 3
n = a[0].length;             // = 4
n = a[1].length;             // = 3
n = a[2].length;             // = 5
var s;
s = a.toString();            // = "D8,D2,D3,D4,B1,B9,B3,C1,C2,C3,C4,C7"
s = a[0].toString();        // = "D8,D2,D3,D4"
s = a[1].toString();        // = "B1,B9,B3"
s = a[2].toString();        // = "C1,C2,C3,C4,C7"

a.sort();                       // ソート → 各配列の先頭要素が比較される
s = a.toString();            // = "B1,B9,B3,C1,C2,C3,C4,C7,D8,D2,D3,D4"
s = a[0].toString();        // = "B1,B9,B3"
s = a[1].toString();        // = "C1,C2,C3,C4,C7"
s = a[2].toString();        // = "D8,D2,D3,D4"

■連想配列

 添え字には、数字の代わりに文字列を指定することもできます。添え字に文字列を持つ配列を連想配列と呼びます。これには、Array オブジェクト、Object オブジェクトを利用します。また、{} で囲むつくり方もあります。
 いずれも、添え字に文字列を設定した時は、代わりに数字を指定することはできません。undefined を返すか、エラーとなりプログラムがストップします。ただし、両者を混在させることは可能です。
// JavaScript Source
var a = new Array();
a["春"] = "Spring";
a["夏"] = "Summer";
a["秋"] = "Autumn";
a["冬"] = "Winter";
var n = a.length;        // = 0 : 長さは0となる
var s;
s = a[0];                   // エラー
s = a["春"];              // = "Spring"
var a = new Object();
a["春"] = "Spring";
a["夏"] = "Summer";
a["秋"] = "Autumn";
a["冬"] = "Winter";
var a = {春 : "Spring", 夏 : "Summer", 秋 : "Autumn", 冬 : "Winter"};
var n = a.length;        // = 0
var s = a["夏"];         // = "Summer"

■クイックソート

クイックソート クイックソートは高速で並べ替えを行う技術の一つです。ただし、要素数が少ない時は効果は希薄です。大量のデータを処理する際(JavaScriptではあまりありませんが)に使われます。
 クイックソートでは、まず基準値を算出します。これには中間値が望ましいのですが、簡易的には、任意の二つないし三つの値の平均を取ることが多いようです。そして、基準値より大きい値を先頭から、小さい値を末尾から探して、見つかったら二つの値を交換します。これを交換すべき要素がなくなる( = 両者が交錯する)まで繰り返していくと、基準値より小さいグループが前方に、大きいグループが後方に集まります。(右図参照)
 さらにグループごとに同様の処理を繰り返していく(再帰処理)ことで、すべての要素の並べ替えが実現します。
// JavaScript Source
// クイックソート関数(昇順)
// ... array : 対象配列, start : 開始インデックス, end : 終了インデックス
function QSort(array, start, end) {
    var i = start;
    var j = end;
    var nBase = Math.floor((array[start] + array[end]) / 2);    // 基準値(平均を適用)
    while (1) {
        while (array[i] < nBase) i++;    // 基準値より大きい値を先頭から探す
        while (array[j] > nBase) j--;    // 基準値より小さい値を末尾から探す
        if (i >= j) break;                     // 両者が交錯していたら抜ける
        var e = array[i];                     // 交錯していなければ値を交換
        array[i] = array[j];
        array[j] = e;
        i++;            // 交換した一つ後に添え字を進める
        j--;            // 交換した一つ前に添え字を進める
    }
    if (start < i - 1) QSort(array, start, i - 1);    // 基準値より小さいグループの再帰処理
    if (end > j + 1)  QSort(array, j + 1, end);      // 基準値より大きいグループの再帰処理
}

// --------------------------
// 要素数50個の配列を作成
var a = new Array(50);
for (i=0; i<a.length; i++) a[i] = Math.floor(Math.random() * 100);

// ソート前の要素を表示
var s = "";
for (i=0; i<a.length; i++) s += a[i].toString() + ", ";
document.Form3.Text3a.value = s;

// クイックソート
QSort(a, 0, a.length-1);

// ソート後の要素を表示
s = "";
for (i=0; i<a.length; i++) s += a[i].toString() + ", ";
document.Form3.Text3b.value = s;
<!-- HTML Source -->
<form name="Form3" style="margin:1ex">[ ソート前 ]<br>
    <textarea name="Text3a" rows="3" cols="70" style="font-size:12px"></textarea>
    <br>[ ソート後 ]<br>
    <textarea name="Text3b" rows="3" cols="70" style="font-size:12px"></textarea>
</form>

www.sasaraan.net

(c) morijoh