ひかくはいれつ

7421 ワード

2つの配列が等しいかどうかをどのように判断しますか?解決策は配列をループし、対応する位置の各要素を1つずつ比較します.配列は参照タイプであるため、=オペレータを使用すると、参照が同じメモリ空間を指しているかどうかを比較できます.たとえば、次のようにします.
 
  var letters:Array = [
  "a""b""c""d"];
  
var lettersPointer:Array = letters;
trace(letters == lettersPointer);  //  : true

ただし、配列の内容が同じですが、異なるメモリ領域では=操作はfalseを返します.
 
  var letters1:Array = [
  "a""b""c""d"];
  
var letters2:Array = [ "a""b""c""d"];
trace(letters1 == letters2];  //  : false

したがって、比較配列は、配列の各要素が等しいかどうかを比較する必要があります.
 
  var equivalent:Boolean = 
  true;
  
for( var i: int = 0; i < letters1.length; i++) {
if(letters1[i] != letters2[i]) {
equivalent =  false;
break;
}
}
trace(equivalent);  //  : true

またArrayUtilitiesを用いることもできる.equals()メソッドで、2つのパラメータが必要です.2つの配列参照、ブール値を返して等しいかどうかを示します.
 
  var letters1:Array = [
  "a""b""c""d"];
  
var letters2:Array = [ "a""b""c""d"];
trace(ArrayUtilities.equals(letters1, letters2));  //  : true

デフォルトでは、2つの異なる配列の配列は等しくありません.3番目のパラメータがtrueである場合を除き、配列の配列順序を無視します.
 
  var letters1:Array = [
  "a""b""c""d"];
  
var letters2:Array = [ "b""a""d""c"];
trace(ArrayUtilities.equals(letters1, letters2));  //  : false
trace(ArrayUtilities.equals(letters1, letters2,  true));  //  : true

equals()メソッドは簡単です.次はコードです.
 
  public 
  static 
  function equals(arrayA:Array, arrayB:Array,
  
bNotOrdered:Boolean):Boolean {
// 
if(arrayA.length != arrayB.length) {
return  false;
}
//  ,
var arrayACopy:Array = arrayA.concat( );
var arrayBCopy:Array = arrayB.concat( );
// 
if(bNotOrdered) {
arrayACopy.sort( );
arrayBCopy.sort( );
}
//  , , , false
for( var i: int = 0; i < arrayACopy.length; i++) {
if(arrayACopy[i] != arrayBCopy[i]) {
delete arrayACopy;
delete arrayBCopy;
return  false;
}
}
//  , , true
delete arrayACopy;
delete arrayBCopy;
return  true;
}