0

[一意の番号][修正番号]タイプの複数の2dim配列をマージしたいそれらをマージしたい(そして一意の結果が得られる)ので、array[一意の番号]が現在。

Array1: retArr
Array2: arg  (multiple 2dim Arrays)

// before here is an additional "for each"-loop which gives me in every iteration a "new" arg-Array.
for (var p:uint = 0; p<arg.length; p++){
  if(retArr.length ==0){
    var tmp:Array = new Array();
    tmp.push(arg[p][0]);
    tmp.push(arg[p][1]);
    retArr.push(tmp);
  }
  else{
    for(var i:uint = 0; i<retArr.length; i++){
      if (retArr[i].indexOf(arg[p][0]) == -1){
         var tmp:Array = new Array();
         tmp.push(arg[p][0]);
         tmp.push(arg[p][1]);
         retArr.push(tmp);
         break;
      }
    }
   }
}

私はラインだと思います

if (retArr[i].indexOf(arg[p][0]) == -1)

retArrで二重の結果が得られるので、これが私の問題です。誰か助けてくれませんか?

4

2 に答える 2

1

要約すると、配列の配列があり、親配列の各配列には2つの要素があります。インデックス0で値が重複しているすべての配列を除外します。これは正しいですか?

もしそうなら、問題は2番目のforループにあります。これがあなたがargに持っているものだと言ってください:

var arg:Array = [[0, 1], [2, 3], [2, 3]]

最初の反復では、retArrには何も含まれていないため、[0、1]が追加され、2番目のforループは実行されません。

2回目の反復では、[2、3]の最初の要素が[0、1]に表示されないため、2番目のforループが1回実行されます。

ここで問題があります。3回目の反復で、2番目のforループが実行されます。[0、1]に2が含まれているかどうかを確認します。含まれていないため、retArrに追加します。[2、3]に2が含まれているかどうかを確認することすらありません。

実行する必要があるのは、retArrのすべての要素をループすることです。一致するものがまったくなかった場合は、配列を安全に追加できます。

var matchFound:Boolean = false;
for(var i:uint = 0; i<retArr.length; i++){
  if (retArr[i].indexOf(arg[p][0]) != -1){
     matchFound = true;
     break;
  }
}
if( ! matchFound) {
  var tmp:Array = new Array();
  tmp.push(arg[p][0]);
  tmp.push(arg[p][1]);
  retArr.push(tmp);
}

別の問題があります。要素0が別の配列の要素1と一致している場合でも、配列を除外しています。重複する要素0を持つ配列のみを除外するには、これを変更します。

if (retArr[i].indexOf(arg[p][0]) != -1){

これに

if (retArr[i].indexOf(arg[p][0]) == 0){

これを実行しただけで、おそらくより速く、より簡単になります。

if(retArr[i][0] == arg[p][0]){
于 2013-02-07T19:51:57.643 に答える
0

これは、スプライスまたは連結を使用することで可能になるようです
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#concat%28%29

retArr長さを計算したり反復したりせずに、配列をにアタッチするだけです。

于 2013-02-07T16:21:16.893 に答える