MQL4のArraySort()は数字しかソートしてくれない
順番が意味を持つアルゴリズムを考える時に、ソートが必要になることがあります。
普通は、MQL4標準関数のArraySort()で事足りるのでしょうが、文字列を含む配列を並び替えたい時は、この関数では対応できません。
「文字列を含む配列なんて使う時ある?」って思われるかもしれませんが、オーダー時のコメント情報をアルゴリズムに組み込むことがたまにあります。
というわけで、必要に迫られて以下のソート関数を作りました。
//+------------------------------------------------------------------+ //|【関数】バブルソート(配列を最初の列値で並替え) | //| | //|【引数】 IN OUT 引数名 説明 | //| --------------------------------------------------------- | //| ○ ○ aArray 配列 | //| ○ aSortType ソートの種類 | //| ┣ 1: 昇順ソート | //| ┗ 2: 降順ソート | //| | //|【戻値】なし | //| | //|【備考】1列目の項目はソートに利用する。 | //| そのため、数字でなければならない。 | //+------------------------------------------------------------------+ void bubbleSort(string &aArray[][], int aSortType) { int asc = 1; // 昇順ソート int dsc = 2; // 降順ソート string tmpAry[]; int rowNum = ArrayRange(aArray, 0); int colNum = ArrayRange(aArray, 1); int elmNum = ArrayResize(tmpAry, rowNum); // 最後の要素を除いて、すべての要素を並替え for(int k = 0; k < rowNum - 1; k++){ // 下から上に順番に比較 for(int i = rowNum - 1; i > k; i--){ if(aSortType == asc){ // 上の方が大きい場合は、入替え if(StrToDouble(aArray[i - 1][0]) > StrToDouble(aArray[i][0])){ for(int j = 0; j < colNum; j++){ tmpAry[j] = aArray[i][j]; aArray[i][j] = aArray[i - 1][j]; aArray[i - 1][j] = tmpAry[j]; } } }else if(aSortType == dsc){ // 上の方が小さい場合は、入替え if(StrToDouble(aArray[i - 1][0]) < StrToDouble(aArray[i][0])){ for(j = 0; j < colNum; j++){ tmpAry[j] = aArray[i][j]; aArray[i][j] = aArray[i - 1][j]; aArray[i - 1][j] = tmpAry[j]; } } } } } }
配列要素の中身は数字でも文字で何でもOKですが、型は文字列型にしておく必要があります。
また、1項目目はソートに使う項目のため、必ず数字型の項目にしておかなければなりません。
さらに、配列の列数は事前に指定しておく必要があり、この例では3列の配列を想定しているため、引数配列の列番号に「3」が記入されています。上記のプログラムを使う時は、ここを適宜変更してください。
ソートアルゴリズムには他にも沢山の種類があって高速化できるのですが、複雑になるし面倒くさかった(!)ので、一番単純なバブルソートを採用しました。
2015/12/15修正 プログラムに不備があったので修正しました。また、引数の列数はいつの間にか不要になっていたので、文を削除しました。