• 締切済み

action script 3.0 sort

ActionScript初心者ですが、宜しければご回答お願いします。 下記スクリプトではtsizeの配列の値のインデックスを比較し、 戻り値として -1 1 0 を得る事ができるのですが、 -1 1 0 の戻り値を処理する工程がわかりません。 trace(alist.sort(tSort)); 上記tSort部分に直接 0 や -1 を記入するとエラーになります。 -1 1 0 の戻り値がどのように処理されているのか教えて頂けませんでしょうか? よろしくお願いします。 var tsize:Array = new Array("SS","S","M","L","LL","XL"); function tSort(a:String, b:String):int { //配列での位置を調べる var indexa:int = tsize.indexOf(a); var indexb:int = tsize.indexOf(b); if (indexa<indexb) { return -1; } else if (indexa>indexb) { return 1; } else { return 0; } } var alist:Array = new Array("LL","M","XL","S","L","SS","M","S"); trace(alist.sort(tSort));

  • Flash
  • 回答数1
  • ありがとう数1

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

まず, 書かれていらっしゃるスクリプトをもっと単純化して, どういう動きをしているのかを観察してみます。 ----------------------- function mySort(A,B):int { trace(A,B); return ★; } var myArr=new Array("要素0","要素1","要素2","要素3","要素4"); trace(myArr.sort(mySort)); ----------------------- ↑これを見ます。 ★=0 の場合 ---------------------------------- function mySort(A,B):int { trace(A,B); return 0; } var myArr=new Array("要素0","要素1","要素2","要素3","要素4"); trace(myArr.sort(mySort)); //---↓出力↓--- //要素1 要素2 //要素0 要素2 //要素3 要素2 //要素4 要素2 //要素4 要素2 //要素3 要素2 //要素0 要素2 //要素1 要素2 //要素2,要素1,要素0,要素3,要素4 ---------------------------------- ★=1 の場合 ---------------------------------- function mySort(A,B):int { trace(A,B); return 1; } var myArr=new Array("要素0","要素1","要素2","要素3","要素4"); trace(myArr.sort(mySort)); //---↓出力↓--- //要素1 要素2 //要素4 要素2 //要素3 要素2 //要素0 要素2 //要素1 要素2 //要素0 要素3 //要素4 要素3 //要素1 要素3 //要素0 要素3 //要素0 要素1 //要素0 要素4 //要素1 要素4 //要素2,要素3,要素4,要素1,要素0 ---------------------------------- ★=-1 の場合 ---------------------------------- function mySort(A,B):int { trace(A,B); return -1; } var myArr=new Array("要素0","要素1","要素2","要素3","要素4"); trace(myArr.sort(mySort)); //---↓出力↓--- //要素1 要素2 //要素0 要素2 //要素3 要素2 //要素4 要素2 //要素4 要素2 //要素1 要素0 //要素4 要素0 //要素3 要素0 //要素3 要素0 //要素3 要素1 //要素1 要素4 //要素3,要素1,要素4,要素0,要素2 ---------------------------------- ★の値によって,演算回数は増減しますが, mySort(A,B) の A と B には, 少なくとも,どれかの要素(真ん中の要素) を軸とした 総当たりの要素ペア が入ることがわかります。 どれかの要素(真ん中の要素) とは上の場合, myArr[2] = 要素2 です。 その他色々やってみると, 要素数が偶数の場合,どれかの要素(真ん中の要素) は, 後半の1つ目になることがわかります。 細かいことはFlashのソートアルゴリズム自体に関わることなので, おそらく意識しなくて良いことだと思います。  mySort(A,B) の A と B には,  ほぼ総当たりで 要素のペア が入る ということだけを意識すれば良いと思います。 というわけで, 以上のことを意識してご質問のスクリプトにコメント行を1行ずつ加えると次のようになります。 ------------------------------------------------- // データの順を示す配列 tsize を作成 var tsize:Array=new Array("SS","S","M","L","LL","XL"); //関数tSortの定義(引数:alist[*]要素,alist[*以外]要素)戻り値:整数 function tSort(a:String, b:String):int { // tsize における alist[*]要素 の順番を調べる var indexa:int=tsize.indexOf(a); // tsize における alist[*以外]要素 の順番を調べる var indexb:int=tsize.indexOf(b); // alist[*]要素 の順が alist[*以外]要素 の順より小さい時 if (indexa<indexb) { // alist[*]要素 を alist[*以外]要素 より前にソート return -1; // alist[*]要素 の順が alist[*以外]要素 の順より大きい時 } else if (indexa>indexb) { // alist[*]要素 を alist[*以外]要素 より後にソート return 1; // alist[*]要素 の順が alist[*以外]要素 の順と同じ時 } else { // ソートをしない return 0; } } // 順を並べかえるデータ配列 alist の作成 var alist:Array=new Array("LL","M","XL","S","L","SS","M","S"); // alist の要素をソート(引数:関数tSort) trace(alist.sort(tSort)); ------------------------------------------------- だいたい以上のような感じ意味になると思います。 全体的な流れは,  「Array.sort(引数)  の 引数 部分に関数をいれておけば,  その関数に Arrey の2要素ずつが渡されて,  sort処理の途中で細かい指示ができる。」 というものです。 === 以下はどうでも良い補足です ====== 実行する内容は全く違いますが, 全体的には次のような流れ(やりとり)になっていると思います(コピペで動作可能)。 ---------------------------------------------- // 擬似Flash側関数(引数:関数)戻り値:文字列 function flashFunc(A:Function):String { if (A("男性ですか?")=="はい") { return "ようこそ。男風呂をゆっくりお楽しみください。"; } else if (A("男性ですか?")=="いいえ") { return "ここは男風呂です。女風呂へ行ってくださいね。"; } else if (A("女性ですか?")=="はい") { return "ようこそ。女風呂をゆっくりお楽しみください。"; } else if (A("女性ですか?")=="いいえ") { return "ここは女風呂です。男風呂へ行ってください!"; } return "申し訳ありませんがオカマの方は御遠慮ください。"; } //---↑以上はFlash側で本来見えないとする↑--- //---↓以下はユーザ側で見えるものとする↓--- // 「男性ですか?」という問いに「いいえ」を返す関数を定義 // カスタム関数(引数:文字列) 戻り値:文字列 function myFunc(Q:String):String { if (Q=="男性ですか?") { return "いいえ"; } return null; } // カスタム関数を引数として擬似Flash側関数を呼び出し // その戻り値を出力 trace(flashFunc(myFunc)); ---------------------------------------------- 妙な例ですみません...。 ソートのイメージ図

netehen
質問者

お礼

とても解り易くご回答して頂き有難う御座います。 初心者の自分ではここまで明確に答えを出すことができませんでした。 コメント並びに例題、Img図のお蔭でスッキリする事ができました。 解らないプログラムがあった場合、 BlurFiltanさんの回答手順を参考にさせてもらおうと思います。 それから「function flashFunc」につきまして、 いつも思うのですが、 「おかま」は題材になるのに、「おなべ」はあまり出てこないですね。 ActionScriptを使いこなせるように精進します。 有難う御座いました。

関連するQ&A

  • ソートについて

    以下のプログラムを実行すると整数のソート結果が "1","12","3"となってしまいます。 整数と文字列を分離させてそれぞれソートさせたいのですが 方法がわかりません。 import java.util.*; import java.io.*; class StrArray{ ArrayList list = new ArrayList(); //最下行に要素を追加 public void add(String data){ list.add(data); } //全ての要素を配列で所得 public String[] getAll(){ String[] all = new String[list.size()]; for(int i=0; i<list.size(); i++){ all[i] = super.get(i); } return all; } public static final int ASC_SORT = 0; public void sort(int mode){ ArrayList al = this.qsort(mode, list); al = list; } //クイックソート public ArrayList qsort(int mode, ArrayList data){ ArrayList result = new ArrayList(); if(data.size()<1){ return new ArrayList(); } String middle = (String)data.get(data.size()/2); ArrayList left = new ArrayList(); ArrayList right = new ArrayList(); for(int i=0; i<data.size(); i++){ if(i != data.size()/2){ if(mode == 0){ if(((String)data.get(i)).compareTo(middle)<=0){ left.add(data.get(i)); } else{ right.add(data.get(i)); } result.addAll(qsort(0, left)); result.add(middle); result.addAll(qsort(0, right)); return result; } return result; } } } } class Sample{ public static void main(String args[]){ StrArray alist = new StrArray(); alist.add("bbb"); alist.add("aaa"); alist.add("ddd"); alist.add("ccc"); alist.add("3"); alist.add("1"); alist.add("12"); alist.sort(0); String[] info = alist.getAll(); for(int i = 0; i < info.length; i++){ System.out.println(info[i]); } } }

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

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,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++で作りたいのですが・・・

    題の通り、C++でクイックソートを作りたいのですが、以下のコードではセグメンテーションエラーで動きませんでした。partition関数があやしいと思い、色々と試してみたのですが、やはりできなかったので、質問させていただくことにしました。 結果としては、print関数で昇順に表示出来ればいいのですが・・・。 以下のコードのどこをどう変えれば良いのか、ご指摘の方、何卒よろしくお願い致します。 #include <iostream> #include <vector> using namespace std; class Array { private: vector<int> array; public: void insert( int value ){ array.push_back( value ); } int getSize( ){ return (int)array.size( ); } void quick_sort( ){ quick_sort( 0, (int)array.size( ) - 1 ); } void quick_sort( int left, int right ); int partition( int left, int right ); void swap(int *a,int *b){int tmp=*a;*a=*b;*b=tmp;} void print( ); }; // クイックソートにより配列の添字 left ~ right の部分を整列する関数 void Array::quick_sort( int left, int right ) { if ( left >= right ) { return; } int v = partition( left, right ); quick_sort( left, v - 1 ); quick_sort( v + 1, right ); } //この関数を考える // 配列の添字 left ~ right の部分を,pivot の値より小さい要素と,大きい要素に分割し pivot の位置を返す関数 int Array::partition( int left, int right ) { int i=left; //左からの処理位置 int j=right; //右からの処理位置 int pivot=array[(int)(left+right)/2]; //基準 int tmp=0; while(true){ while(array[i]<pivot){i++;} while(array[j]>pivot){j--;} if(i>=j){return i;} tmp=array[i]; array[i]=array[j]; array[j]=tmp; i++; j++; } } // 配列の内容を表示する関数 void Array::print( ) { for ( int i = 0; i < (int)array.size( ); i++ ) { cout << array[i] << " "; } cout << endl; } int main( ) { Array a1; a1.insert( 56 ); a1.insert( 34 ); a1.insert( 57 ); a1.insert( 64 ); a1.insert( 3 ); a1.insert( 87 ); a1.insert( 85 ); a1.insert( 37 ); a1.insert( 21 ); a1.insert( 4 ); a1.insert( 68 ); a1.insert( 62 ); a1.insert( 42 ); a1.insert( 55 ); a1.insert( 63 ); a1.insert( 95 ); a1.insert( 7 ); a1.insert( 32 ); a1.insert( 78 ); a1.insert( 11 ); cout << "要素数: " << a1.getSize( ) << endl; cout << "ソート前: "; a1.print( ); a1.quick_sort( ); // ここで,ソートを行う関数を呼び出す cout << "ソート後: "; a1.print( ); return 0; }

  • C++でのマージソートの実現方法について

    C++でのマージソートの実現方法について、以下のコードを書いたのですが、どうしてもうまくソートできませんでした。 marge関数がおかしいと思うのですが、自分で確かめてみても、どこがおかしいのか分かりませんでした。 どなたか、どうすればソートされた結果がメイン関数で表示されるようにできるのか教えていただけないでしょうか? #include <iostream> #include <vector> using namespace std; class Array { private: vector<int> array; public: void insert( int value ){ array.push_back( value ); } int getSize( ){ return (int)array.size( ); } void marge_sort( ){ marge_sort( 0, (int)array.size( ) - 1 ); } void marge_sort( int left, int right ); void marge( int left, int middle, int right ); void print( ); }; // マージソートにより配列の添字 left ~ right の部分を整列する関数 void Array::marge_sort( int left, int right ){ if( left >= right ) { return; } int middle = (left + right) / 2; //中央の添字を求める marge_sort( left, middle ); //左の要素が全てバラバラになるまで marge_sort( middle + 1 , right ); //右の要素が全てバラバラになるまで marge( left, middle, right ); //バラバラの要素をソートして併合 } // 個別にソートされた2つの配列(添字 left ~ middle と添字 middle+1 ~ right)を作業用配列を使ってマージする関数 void Array::marge( int left, int middle, int right ) { int num=right-left; int *tmp=new int[num]; int t=0,l=left,r=middle; while(l<middle&&r<right){ if(array[l]<=array[r]){ tmp[t++]=array[l++]; } else { tmp[t++]=array[r++]; } } while(l<middle){ tmp[t++]=array[l++]; } while(r<right){ tmp[t++]=array[r++]; } for(int i=0;i<num;i++){ array[left+i]=tmp[i]; } delete tmp; } // 配列の内容を表示する関数 void Array::print( ) { for ( int i = 0; i < (int)array.size( ); i++ ) { cout << array[i] << " "; } cout << endl; } int main( ) { Array a1; a1.insert( 56 ); a1.insert( 34 ); a1.insert( 57 ); a1.insert( 64 ); a1.insert( 3 ); a1.insert( 87 ); a1.insert( 85 ); a1.insert( 37 ); a1.insert( 21 ); a1.insert( 4 ); a1.insert( 68 ); a1.insert( 62 ); a1.insert( 42 ); a1.insert( 55 ); a1.insert( 63 ); a1.insert( 95 ); a1.insert( 7 ); a1.insert( 32 ); a1.insert( 78 ); a1.insert( 11 ); cout << "要素数: " << a1.getSize( ) << endl; cout << "ソート前: "; a1.print( ); a1.marge_sort(); // ここで,ソートを行う関数を呼び出す cout << "ソート後: "; a1.print( ); return 0; } // 実行結果 要素数: 20 ソート前: 56 34 57 64 3 87 85 37 21 4 68 62 42 55 63 95 7 32 78 11 ソート後: 3 4 34 37 21 42 55 56 57 62 63 7 32 64 68 78 85 87 95 11 ↑のソート後の表示が、昇順にソートされるようにしたいのです。

  • java(バブルソート/単純挿入ソート)

    以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }

  • ソートの名称について

    以下のようなソートに、選択ソートやバブルソート等といった名称は存在しますか? #include <stdio.h> int main(void) { int array[10]; int i, j, tmp; /* Input */ for(i=0; i<sizeof(array)/sizeof(int); i++){ printf("array[%d]> ", i); scanf("%d", &array[i]); } /* Sort */ for(i=0; i<sizeof(array)/sizeof(int)-1; i++){ for(j=i+1; j<sizeof(array)/sizeof(int); j++){ if(array[i]>array[j]){ tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } /* Output */ for(i=0; i<sizeof(array)/sizeof(int); i++){ printf("array[%d]: %d\n", i, array[i]); } return 0; }

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • 配列をソートしたいです

    配列をソートしたいです 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
  • 関数で定義した配列のソート

    お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。

  • 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>"); } と表示したいのですが、ソートした個数に対応した商品のソートの 仕方がわかりません。 どのような方法があるのでしょうか? よろしくお願いします。

専門家に質問してみよう