【ActionScript】配列の昇順降順混合の複合ソートはできますか?

このQ&Aのポイント
  • FLASH8(Win-XP)使用者です。配列の複合ソートを昇順降順おりまぜてしたいのですが可能でしょうか?下記のスクリプトですと、高さも幅も降順になります。しかし実際には高さは降順、幅は昇順にしたいのです。
  • myArrayという配列に高さと幅の情報があり、これを昇順降順を組み合わせてソートしたいです。
  • 現在のスクリプトでは、高さと幅の両方が降順にソートされますが、高さは降順、幅は昇順にしたいです。解決方法を教えてください。
回答を見る
  • ベストアンサー

【ActionScript】配列の昇順降順混合の複合ソートはできますか?

FLASH8(Win-XP)使用者です。 配列の複合ソートを昇順降順おりまぜてしたいのですが可能でしょうか? 下記のスクリプトですと、高さも幅も降順になります。 しかし実際には高さは降順、幅は昇順にしたいのです。 myArray = new Array; myArray.push({takasa:"20", haba:"40"}); myArray.push({takasa:"20", haba:"20"}); myArray.push({takasa:"40", haba:"10"}); myArray.push({takasa:"20", haba:"15"}); myArray.push({takasa:"40", haba:"20"}); myArray.push({takasa:"40", haba:"15"}); myArray.sortOn(["takasa","haba"],Array.DESCENDING); for(i=0; i<myArray.length; i++){ trace("高="+myArray[i].takasa + " 幅=" + myArray[i].haba); } <結果> 高=40 幅=20 高=40 幅=15 高=40 幅=10 高=20 幅=40 高=20 幅=20 高=20 幅=15 お詳しい方、よろしくお願いいたします。

  • Flash
  • 回答数3
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

sortOn の条件は数値でも指定できます。 ・・・というよりも、Array.NUMERIC などがそもそも、フラグの意味を分かりやすくするために用意されている定数にすぎません。 いうなれば、Math.PI と書くと円周率の近似値 3.1415…と解釈されるけれど、数値で直接 3.1415…と書くこともできるのと、同じ話です。 デフォルトの「文字コード順に」「昇順」でソートするための定数は定義されていませんが、どのフラグも立てないデフォルトの条件とは、数値にすると 0 です。 つまり 0 を渡すと、条件の指定なしということでデフォルトの「文字コード順に」「昇順」のソートになります。 「文字コード順に」「降順」でソートする時は Array.DESCENDING を渡します。 定数で書けず数値でしか表現できない条件は、デフォルトの「文字コード順に」「昇順」のソートだけですね。 例えば、 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  myArray =  [   { h : 20 , material : "マツ" , w : 10 } ,   { h : 100 , material : "ラワン" , w : 20 } ,   { h : 40 , material : "ヒノキ" , w : 15 } ,   { h : 20 , material : "ラワン" , w : 10 } ,   { h : 20 , material : "ヒバ" , w : 20 } ,   { h : 40 , material : "ヒノキ" , w : 40 } ,   { h : 20 , material : "スギ" , w : 25 } ,   { h : 40 , material : "マツ" , w : 20 }  ]; このような配列変数があり、これを  ・高さ( h )については「数値の順に降順」  ・材質( material )については「文字コードの順に昇順」  ・幅( w )については「数値の順に昇順」 という条件でソートするとします。 フィールドごとに条件を指定する sortOn では、フィールドの数と条件の数が一致していなければなりません。 中央の” material ”フィールドはデフォルトの条件でいいのですが、  myArray.sortOn( [ "h" , "material" , "w" ] , [ Array.NUMERIC | Array.DESCENDING , , Array.NUMERIC ] ); ↑こう書くと、当然ながらエラーになってしまいます。 そこで、” material ”フィールドの条件には、どのフラグも立てない 0 を渡します。  myArray.sortOn( [ "h" , "material" , "w" ] , [ Array.NUMERIC | Array.DESCENDING , 0 , Array.NUMERIC ] ); 裏ワザのようですけれど、文字列が格納されているフィールドでは NUMERIC フラグは無視されるだけなので、NUMERIC をダミーとして詰めておくのも1つの手です。 ただし、数値が入っているフィールドをあえて「文字コード順に」「昇順」でソートする場合は通用しません。このような場合は 0 を指定してください。 ----------------------------------------------------------------- 冒頭にも書きましたように、sortOn の条件の指定に使う Array クラスの NUMERIC や DESCENDING は定数で、それぞれ決まった数が定義されています。 定数の内容は次の通りです。 ( )内が、定義されている数値です  ・CASEINSENSITIVE( 1 )    大文字・小文字を区別せずにソートします。  ・DESCENDING( 2 )    降順にソートします。  ・UNIQUESORT( 4 )    全く同じ条件のものがあった時に、ソートを中断します。  ・RETURNINDEXEDARRAY( 8 )    元の配列の並び方を変えず、並び替えた後の順番だけを取得できます。  ・NUMERIC( 16 )    数値の大小で比較します。文字列のフィールドでは無効です。 例えば「数値の大小で」「昇順」のソートは  myArray.sortOn( "w" , 16 ); と書くよりも  myArray.sortOn( "w" , Array.NUMERIC ); の方が、”数値で比較するソート”であることが分かりやすくなります。 Array.NUMERIC は 16 のことですから、数値で書いても Array クラスで定義されている定数で書いても意味は全く同じです。 複数の条件を指定する場合も同様で、例えば「数値の大小で」「降順」にソートする条件は  Array.NUMERIC | Array.DESCENDING というように書きますが、これは  16 | 2 として解釈されます。 16 | 2 の計算結果は 18 です。 NUMERIC や DESCENDING の代わりに 18 を直接渡してもいいですし、もちろん 16 | 2 と書くこともできます。 OR 演算がよく分からない時は、trace アクションを使って  trace( Array.NUMERIC | Array.DESCENDING ); で、結果が分かります。 Windows に付いている「電卓」は、関数電卓モードにすると OR やその他のビット演算も計算できます。 定数を使うと分かりやすくはなるのですが、全て大文字である上に概して名前が長く、複数の条件を組み合わせるなど条件の数が多い時はかえって見にくくなるのも事実です。 場合によって、数値の指定と使い分けてください。 ただ、数値で指定するとスクリプトが短くスッキリまとまるものの、意味は分かりにくくなります。 後で見た時に「どんな条件のソートだったかな?」とならないように、コメントを入れておくといいですよ。

ikataro
質問者

お礼

う~ん、なるほど! 0を使うのですか。 配列も実に奥が深いですね。 このたびは感動の3連発本当にお世話になりました。

その他の回答 (2)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

#1です。 まず、訂正なのですが。 フィールドごとに条件を変える時の sortOn は、正確には  myArray.sortOn( [ "takasa" , "haba" ] , [ Array.NUMERIC | Array.DESCENDING , Array.NUMERIC ] ); でした。 #1の書き方ですと、takasa のフィールドが文字コード順のソートになります。 今回の例はどれも同じく2桁の数値なので文字コード順でも何とか上手くいくのですが、例えば takasa に 100 が入っている場合、降順で最も先になるはずが最後になってしまいます。 数値の大小でソートするなら、NUMERIC フラグを渡して明示的に数値として比較するべきですね。 失礼いたしました。 ------------------------------------------------------------------- もう1点は補足です。 sortOn は、デフォルトでは「文字コード順に」「昇順」のソートです。 つまり、何も指示しなければ昇順のソートであり、数値が入っている場合であっても文字コード順で比較されます。 NUMERIC フラグを渡すと、文字コード順ではなく数値の大小で比較されるようになります。 ですから、NUMERIC フラグだけを渡した場合は「数値の大小で」「昇順」のソートになります。 NUMERIC フラグが”昇順でソートせよ”との意味を持っているのではありません。 デフォルトで昇順のソートなので、あえて昇順を指示するフラグは必要ないということだと思います。 DESCENDING は”降順に”ソートするように指示するフラグです。 従って、このフラグだけを渡すと「文字コードの順に」「降順」のソートに、NUMERIC フラグとともに渡すと「数値の大小で」「降順」のソートになります。 NUMERIC フラグの逆の意味が DESCENDING フラグなのではありません。 説明が足りず誤解を招いてしまったようで、重ね重ね失礼いたしました。 この場をお借りしまして、訂正・補足させていただきます。 Array クラスが持っている DESCENDING や NUMERIC はスイッチのようなもので、渡すフラグの組み合わせでソートの条件が変化します。 ビット演算の OR (演算子” | ”)で、複数のフラグを組み合わせることができます。 他にもいろいろな組み合わせがありますので、機会がありましたら使ってみてください。

ikataro
質問者

お礼

めんどうな質問に付き合っていただきありがとうございます。 そういうことですか。これは勉強になります。 しかしここで新たな疑問が… [ Array.NUMERIC | Array.DESCENDING , Array.NUMERIC ] の右部分が仮に「文字コード順に」だったら書くものがない… [ Array.NUMERIC | Array.DESCENDING , ] と書くわけには? 明示するものがないというのはなんか困るような・・

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

まず、配列変数の各フィールドの値が数値ではなく文字列になっていますが、何か事情があるのでしょうか? 文字列が入っている場合は数値として判断する NUMERIC フラグが無効になり、必ず文字コードの順にソートされます。 文字コードの順とは、例えば 1 ・ 2 ・ 11 を昇順にソートすると、2 が 11 よりも大きいと判断されて 1 → 11 → 2 の順になるということです。 数値の大小でソートする時に NUMERIC フラグが使えないととても不便ですから、特に事情がないのなら最初から数値を入れる方が得策です。 以下は、各フィールドに数値を入れた場合の話です。 数値を入れる時は  myArray.push( { takasa : 20 , haba : 40 } );  myArray.push( { takasa : 20 , haba : 20 } );   : というように、数値を " " でくくらずに入れてください。 Flash Player 8 からは、配列変数のフィールドごとにソートの条件を指定できるようになりました。 sortOn の部分を  myArray.sortOn( [ "takasa" , "haba" ] , [ Array.DESCENDING , Array.NUMERIC ] ); このように変更してみてください。 trace アクションの結果は次のようになります。  高=40 幅=10  高=40 幅=15  高=40 幅=20  高=20 幅=15  高=20 幅=20  高=20 幅=40 takasa については降順で、 haba については昇順に並びます。 つまり、takasa に同じ値が複数ある場合は haba の値が小さいものが先になります。 takasa に同じ値がない時は takasa の降順ソートが優先されます。 ------------------------------------------------------------------ 単純に、takasa を見る時は降順・ haba を見る時は昇順で、同値の時に相方のフィールドの大小を問わないのであれば、その都度 sortOn を実行するか、元の配列を変更しない RETURNINDEXEDARRAY フラグを指定して並べ替えた後のリストを2種類用意すれば済みます。 RETURNINDEXEDARRAY フラグを使った作例は以前別の質問で紹介しましたので、よろしければご参照ください。 #2で説明しております。  ・配列操作   http://okwave.jp/qa1061651.html 今回の例で言いますと、takasa について降順で並べ替えたリストと haba について昇順で並べ替えたリストを2つ用意します。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //オリジナルの配列変数  myArray = new Array;  //takasaとhabaのソート結果を保持する配列変数  t_list = new Array();  h_list = new Array();  //オリジナルの配列変数の中身  myArray.push( { takasa : 20 , haba : 40 } );  myArray.push( { takasa : 20 , haba : 20 } );  myArray.push( { takasa : 40 , haba : 10 } );  myArray.push( { takasa : 20 , haba : 15 } );  myArray.push( { takasa : 40 , haba : 20 } );  myArray.push( { takasa : 40 , haba : 15 } );  //takasaについては降順、habaについては昇順のリストを作る  t_list = myArray.sortOn( "takasa" , Array.NUMERIC | Array.DESCENDING | Array.RETURNINDEXEDARRAY );  h_list = myArray.sortOn( "haba" , Array.NUMERIC | Array.RETURNINDEXEDARRAY );  //ソートの結果を出力  trace( "-- takasaの大きい順に表示 --" );  for( i = 0 ; i < t_list.length ; i++ )  {   trace( "Index=" + t_list[ i ] + " 高=" + myArray[ t_list[ i ] ].takasa + " 幅=" + myArray[ t_list[ i ] ].haba );  }  trace( "\n-- habaの小さい順に表示 --" );  for( i = 0 ; i < h_list.length ; i++ )  {   trace( "Index=" + h_list[ i ] + " 高=" + myArray[ h_list[ i ] ].takasa + " 幅=" + myArray[ h_list[ i ] ].haba );  } trace アクションの結果は次のようになります。  -- takasaの大きい順に表示 --  Index=5 高=40 幅=15  Index=4 高=40 幅=20  Index=2 高=40 幅=10  Index=3 高=20 幅=15  Index=1 高=20 幅=20  Index=0 高=20 幅=40  -- habaの小さい順に表示 --  Index=2 高=40 幅=10  Index=5 高=40 幅=15  Index=3 高=20 幅=15  Index=1 高=20 幅=20  Index=4 高=40 幅=20  Index=0 高=20 幅=40 ” Index ”は元の配列( myArray )のインデックス番号です。この番号が、t_list および h_list の中に入っています。 元の配列変数の並びは変わっていません。 希望の条件で並べ替えた後のリストだけ複数用意しておくと、どのような順番でも表示できます。 sortOn に渡すフラグが長くなって見辛いのであれば、ビット演算の結果を数値で渡すこともできます。 先の例では  //takasaについては降順、habaについては昇順のリストを作る  t_list = myArray.sortOn( "takasa" , 26 );  h_list = myArray.sortOn( "haba" , 24 ); としても同様の結果になります。 Array クラスのソートは、デフォルトでは数値であっても”文字コード順”です。 今回の件ではどの値も一律2桁で、文字コードの順にソートされても影響はありませんが、各数値の桁が異なる場合は特に NUMERIC フラグを渡さないと大小の判断が正しくなくなることがありますので、ご注意ください。

ikataro
質問者

お礼

なるほど!! ""は余計でしたね・・ DESCENDINGの逆はNUMERICだったとは知りませんでした。 専門書は何冊かありますがこのような解説はありませんでした。 もっと詳しい本を探した方が良さそうですね・・ 感謝、ありがとうございました。

関連するQ&A

  • usortで3つの項目を昇順・降順でソートしたいのですが

    usortで3項目で昇順と降順でソートしたいのですが、いろいろ検索して読んでみたのですが、単純なソートしか掲載されてなく、わかりませんでした。できればロジックで、お願いします。 $aryData=array (0=>array('corp'=>'corp01', 'date'=>'11-01','item'=>'item03'), (1=>array('corp'=>'corp02', 'date'=>'11-05','item'=>'item02'), (2=>array('corp'=>'corp01', 'date'=>'11-05','item'=>'item02'), (3=>array('corp'=>'corp03', 'date'=>'11-01','item'=>'item01'), (3=>array('corp'=>'corp02', 'date'=>'11-01','item'=>'item01'),・・・); を例えが変ですが、itemを昇順、dateを降順、corpを昇順の順でソートをするとしたら、どのように記述すれば宜しいのですか。

    • ベストアンサー
    • PHP
  • 2次元配列 ソート

    はじめまして。 FLASH8を使っています。 2次元配列のソートがうまくいかず困っています。 Array[0][0] = "かかか"; Array[0][1] = "ききき"; Array[0][2] = "くくく"; Array[1][0] = "あああ"; Array[1][1] = "いいい"; Array[1][2] = "ううう"; とあって2番目の要素(「ききき」「いいい」の部分です)をキーとしてArray[n]を昇順にソートしたいのです。 この場合結果としては、 Array[0][0] = "あああ"; Array[0][1] = "いいい"; Array[0][2] = "ううう"; Array[1][0] = "かかか"; Array[1][1] = "ききき"; Array[1][2] = "くくく"; となります。 ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 配列をソートしたいです

    配列をソートしたいです ArrayクラスのsortOn()を使って、 「x座標の大きい順」に順番をならべ変えたいのですが 上手く行きません。。 現在、配列を使い 3つの矩形のSpriteを配置しています。 ↓現在のコード ===================================== var arr:Array = new Array(); for(var i:int=0; i<3; i++){  arr[i] = new Sprite();  with(arr[i].graphics){   beginFill(0x666666);   drawRect(0,0,8,8);   endFill();  }  arr[i].x = i*10;  addChild(arr[i]); } ===================================== 今、各Spriteのxプロパティは  arr[0].x = 0;  arr[1].x = 10;  arr[2].x = 20; になっているのですが、 これをソートして  arr[0].x = 20;  arr[1].x = 10;  arr[2].x = 0; にならべ変えたいのですが、 どのように書けばいいのかがわかりません。。 今、このように書いてるのですが arr.sortOn(arr.x, Array.NUMERIC); 並べ替えができません、 (おそらく arr.x が駄目なのだと思うのですが。。) どなたかご存知の方いらっしゃいましたら どうかよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 昇順ソート

    sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s, 256, fin) != NULL) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23

  • ASP.NET 2.0(C#) GridViewのソート機能をデフォルトで降順にしたい

    GridViewコントロールで「並べ替えを有効」にすると、各フィールドごとに、ヘッダーのリンクをクリックするたびに昇順→降順でソートできるようになりますが、これをあるフィールドだけ、降順→昇順にすることはできないでしょうか? GridView1のSortingイベントで protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) { //hogeフィールドだけデフォルトで降順にしたい if (e.SortExpression == "hoge") { if (e.SortDirection == SortDirection.Ascending) e.SortDirection = SortDirection.Descending; else e.SortDirection = SortDirection.Ascending; } } などとしてみたのですが、これでは常に降順になってしまいます。 よろしくお願いします。

  • 2つの配列のソート

    配列のソートについての質問です。 よろしくお願いします。 var syouhin = new Array(10); //商品名 var kosuu = new Array(10);  //商品個数 syouhin[0] = "apple"; syouhin[1] = "orange"; ... syouhin[9] = "banana"; kosuu[0] = "4"; kosuu[1] = "2"; ... kosuu[9] = "5"; 個数は[]の数字の商品に対応。 個数をソート kosuu.sort(); ここでソートした個数に対応して商品もソートして、 for (i=0; i<kosuu.length; i++){ document.write(syouhin[i],kosuu[i],", "); document.write("<br>"); } と表示したいのですが、ソートした個数に対応した商品のソートの 仕方がわかりません。 どのような方法があるのでしょうか? よろしくお願いします。

  • javascriptの標準仕様で用意されているオブジェクトを拡張しても

    javascriptの標準仕様で用意されているオブジェクトを拡張してもよいのかしら?  例えば、Arrayオブジェクトを拡張して降順ソートをやりたい時、   data=[1,2,3,4];   data.sort(function(a,b){return(b-a);});   alert(data);  のように使うのは、仕様にあるので許されると思います。   Array.prototype.descending=function(){    this.sort(function(a,b){return(b-a);});    return this;   }   data=[1,2,3,4];   alert(data.descending());  のようにArrayオブジェクトを拡張して使って問題ないでしょうか?  あるいは、   function myArray(arg){    this.descending=function(){     arg.sort(function(a,b){return(b-a);});     return arg;    }   }   data=[1,2,3,4];   data=new myArray(data);   alert(data.descending()); のように使うべきものなのでしょうか?

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 昇順と降順

    C言語でクイックソートを行うプログラムを探していたところ、希望していたものが見つかりました。 このプログラムは与えられた数列を昇順に並び替えるものなのですが、これを降順に並び替えるにはどうしたらよいでしょうか? いろいろ試してみたのですが、無限ループになってしまいます。 #include <stdio.h> void QSort(int x[ ], int left, int right); void Swap(int x[ ], int i, int j); void ShowData(int x[ ], int n); void main(void); /* クイックソートを行う */ void QSort(int x[ ], int left, int right) { int i, j; int pivot; i = left; /* ソートする配列の一番小さい要素の添字 */ j = right; /* ソートする配列の一番大きい要素の添字 */ pivot = x[(left + right) / 2]; /* 基準値を配列の中央付近にとる */ while (1) { /* 無限ループ */ while (x[i] < pivot) /* pivot より大きい値が */ i++; /* 出るまで i を増加させる */ while (pivot < x[j]) /* pivot より小さい値が */ j--; /* 出るまで j を減少させる */ if (i >= j) /* i >= j なら */ break; /* 無限ループから抜ける */ Swap(x, i, j); /* x[i] と x[j]を交換 */ i++; /* 次のデータ */ j--; } ShowData(x, 10); /* 途中経過を表示 */ if (left < i - 1) /* 基準値の左に 2 以上要素があれば */ QSort(x, left, i - 1); /* 左の配列を Q ソートする */ if (j + 1 < right) /* 基準値の右に 2 以上要素があれば */ QSort(x, j + 1, right); /* 右の配列を Q ソートする */ } /* 配列の要素を交換する */ void Swap(int x[ ], int i, int j) { int temp; temp = x[i]; x[i] = x[j]; x[j] = temp; } /* n 個のデータを表示する */ void ShowData(int x[ ], int n) { int i; for (i = 0; i < n ; i++) printf("%d ", x[i]); printf("\n"); } void main(void) { /* ソートする配列 */ int x[ ] = {6, 3, 1, 7, 0, 4, 8, 5, 2, 9}; int n = 10; printf("ソート前:\n"); ShowData(x, n); printf("ソート中:\n"); QSort(x, 0, n - 1); printf("ソート後:\n"); ShowData(x, n); }

  • 1次元配列のソート方法

    配列のソートメソッドについて質問させていただきます。 VB.NET初心者なので日本語がおかしいかもしれませんが、宜しくお願いいたします。 データテーブルが格納されている配列があり、 その配列をソートしたいと思っています。 データテーブルの中に「NO」と「ID」というフィールドがあります。 NOで昇順し、NOが同じだったらIDの昇順でソートといったことがしたいのですが、 条件によっては上手くいきません。 よろしければ、教えていただけないでしょうか? また、もっと効率の良い方法とかありましたら、具体的はソース等教えていただけないでしょうか? 宜しくお願いいたします。 [例] workDT() ← 元のデータテーブル配列 Dim Datatable(workDt.Rows.Count-1) As DataTable ← ソート後のデータテーブル配列 Dim tmpDatatable(workDT.Rows.Count-1) As DataTable ← 途中で使うデータテーブル配列 Dim NO(workDT.Rows.Count-1) As Integer ← 元のデータテーブル配列の各「NO」フィールドを格納する配列 Dim ID(workDT.Rows.Count-1) As String ← 途中で使うデータテーブル配列の各「ID」フィールドを格納する配列 Dim Index(workDT.Rows.Count-1) As Integer ← インデックスに使用 ' IDでソート For i = 0 To workDt.Length - 1 ID(i) = workDt(i).Rows(0).Item("ID") Index(i) = i Next ' 配列をIDでソート Array.Sort(ID, Index) ' ソート後配列をテンプ配列に格納 For i = 0 To workDt.Length - 1 tmpDatatable(i) = workDt(Index(i)).Copy Next ' NOでソート For i = 0 To tmpDatatable.Length - 1 NO(i) = tmpDatatable(i).Rows(0).Item("NO") Index(i) = i Next ' 配列をNOでソート Array.Sort(NO, Index) ' ソート後配列を格納 For i = 0 To tmpDatatable.Length - 1 Datatable(i) = tmpDatatable(Index(i)).Copy Next これで各配列を初期化します。 workDTに5つのデータテーブルが入っていて workDT(0):ID=3、NO=1 workDT(0):ID=1、NO=5 workDT(0):ID=2、NO=5 workDT(0):ID=4、NO=5 workDT(0):ID=5、NO=7 (IDは重複不可設定、NOは重複可設定です。) とした場合、NOのソートのところで変な順番になってしまいます。 Array.Sort(NO, Index) このメソッドは同じ値だった場合、何を優先してソートしているのでしょうか? 環境はWindowsXPSP3とVB2005です。

専門家に質問してみよう