配列の比較(大変申し訳ありません再度質問です。)
以前ActionScriptの配列の比較で一度ご質問させて頂き解決(DPE様へご教授頂き)したのですが、その後改良しまた問題が出てきてしまいました。
複数のチェックボックスの値(true,false)を取得して配列に格納し、別の配列(A、B、C)と比較をし一致項目の多い配列を決める処理で
「全てのチェックボックスの選択状況を集めたデータを作り、同じ数のデータ同士で比較」という方法をご教授頂き参考のScriptまで書いて頂いたのですが
http://okwave.jp/qa/q7608367.html
例として・・・・
・チェックボックスが9個あり
・それぞれ、1~9まで任意の名前がついております。
・チェックされた値を取得し
アンサー配列[2,3,4]を作った場合
一致項目が多いもの
A配列[1,2,3,4,7,"サンプルA"] この場合3個同じ
B配列[1,2,3,4,5,6,7,9,"サンプルB"] この場合3個同じ
C配列[2,3,7,8,"サンプルC"] この場合2個同じ
現状同数の場合、A配列「サンプルA」が表示されます。
1つのみ表示をさせているんですが、最大の数で同数の場合(3が一致項目が多い)、複数表示という仕組みに切り替えたいと四苦八苦しておりました・・・(T_T)
結果的に「サンプルA、サンプルB」というように表示させたいのです。
※完全一致なら表示されるのは1つだけになります。
解決済みの問題を再度掘り返すようで大変申し訳ありませんが、どなたかご教授頂ければとおもいます。よろしくお願いたします。
説明が上手くできてなくて、意味不明や、何か問題などございましたらすぐに対応させて頂きますのでご連絡頂ければとおもいます。
※DPE様にご教授頂きましたScriptを若干変更し現在利用しております。
現在のScript
//***
/*
初期設定
*/
//チェックボックスの選択状況を格納する配列
var check_status:Array = new Array();
//チェックパターンデータ
//最後の要素はパターン名
var check_ptt:Array =
[
[ 1 , 1 , 1 , 1 , 0 , 0 , 1 , 0 , 0 , "サンプルA" ] ,
[ 1 , 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , "サンプルB" ] ,
[ 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 0 , "サンプルC" ]
];
//評価を格納する配列
var score_tbl:Array = new Array();
//チェックボックスの総数
var box_max:Number = 9;
//チェックボックスが配置されているタイムラインを保持
var box_line:MovieClip = this;
/*
照合の処理
*/
function Check_Compare():Void
{
var i:Number , j:Number;
var score:Number , check_score:Number;
var flags:Number;
//選択状況とパターンを総当たりで照合する
for( i = 0 ; i < check_ptt.length ; i++ )
{
//評価をリセット
score = 0;
check_score = 0;
for( j = 0 ; j < box_max ; j++ )
{
//選択されるべき項目との一致を照合
//両方とも1(選択されている)である場合、評価が+1、それ以外は加算されない
check_score += check_ptt[ i ][ j ] & check_status[ j ];
//全体の照合処理
//一致していた場合、評価が+1、それ以外は加算されない
score += Number( check_ptt[ i ][ j ] == check_status[ j ] );
}
//デバッグ
trace( "Score " + i + " = " + score );
trace( "Check_on " + i + " = " + check_score );
//評価を記録する配列変数に結果を記録
//フィールド名
// ptt_no:パターンの番号
// check_on:選択するべき項目と一致した数
// total_score:総合評価
score_tbl[ i ] = { ptt_no : i , check_on : check_score , total_score : score };
}
//評価の高い順に並べ替え
//選択するべき項目と一致した数が多いものほど高評価
//同点の場合は総合評価で優劣を決める
flags = Array.NUMERIC | Array.DESCENDING;
score_tbl.sortOn( [ "check_on" , "total_score" ] , [ flags , flags ] );
/*ここに、評価を利用する処理を書く*/
/*今回は一致した数が最も多かったパターンの名前を出力*/
/*ダイナミックテキストに出力*/
t1 = check_ptt[ score_tbl[ 0 ].ptt_no ][ box_max ] );
}
/*
照合開始ボタンの処理
*/
btn.onRelease = function():Void
{
var i:Number;
//選択状況を配列変数に格納
//選択されている場合1、されていない場合は0を入れる
for( i = 0 ; i < box_max ; i++ )
{
check_status[ i ] = Number( box_line[ "cbox" + i ].selected );
}
//パターンと照合する
Check_Compare();
};
//***
お礼
どうも、ありがとうございました。