作者etrexetrex (moonet)
看板Flash
標題Re: [問題] 我想比較兩個陣列的不同?
時間Sun Oct 10 02:43:38 2010
※ 引述《cjcat2266 (CJ Cat)》之銘言:
: ※ 引述《kaiyine (yumi)》之銘言:
: : 陣列a是5,2,6,8,4
: : 陣列b是0,1,2,3,4,5,6,7,8,9,10
: : 我要如何列出陣列a缺少0,1,2,3,7,9,10呢?
: 這就是"集合"的問題了
: 同上一篇回文所說的,可以用associative array
: (如果是AS3就可以用Dictionary class,相當於C++的map class)
: 其實可以更簡短的寫
: (以下code未經過測試,可能有錯字)
: var a:Array = [5, 2, 6, 8, 4];
: var b:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
: //集合物件
: var obj:Object = new Object();
: var i:Number, len:Number;
: //讓a的元素作為key,跟true值產生關連
: for (i = 0, len = a.length; i < len; ++i) {
: obj[a[i]] = true;
: }
: //尋找"a沒有,b有的元素"
: for (i = 0, len = b.length; i < len; ++i) {
: //若obj[b[i]]沒有關聯值,那就是undefined,!undefined == true
: if (!obj[b[i]]) {
: trace("a沒有含" + b[i]);
: }
: }
也可以存 inverse A,不過其實是一樣的
多花了點記憶體,得到了一些加速
假設:
A陣列中沒有重複出現相同的值
程式:
var i:Number;
var a:Array = [5, 2, 6, 8, 4];
var b:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var aLength : Number = a.length;
var bLength : Number = b.length;
//建立A的反向表 此處inverseA的型態是陣列
var inverseA:Array = [];
for (i = 0 ; i < aLength; i++ )
inverseA[a[i]] = i;
var inverseALength : Number = inverseA.length;
//多花的記憶體在 inverseA
trace("aLength = " + aLength); //aLength = 5
trace("bLength = " + bLength); //bLength = 11
trace("inverseALength = " + inverseALength); //inverseALength = 9
//尋找"a沒有,b有的元素"
for (i = 0; i < bLength; i++ )
{
//加速在這裡
if(b[i] >= inverseALength)
trace("a沒有含" + b[i]);
//基本上 Array 的存取也會比 Object 快些
else if(inverseA[b[i]] == undefined)
trace("a沒有含" + b[i]);
}
為了確認Array 的空值是 undefined
只好打開 flash cs4
所以上面的程式已經測過了
--
blog:
http://etrex.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.161.83
推 hpuser:請問inverseA的長度為什麼是9呢?想很久想不通@@? 10/10 03:10
→ hpuser:不是才跑5次嗎? 10/10 03:11
推 ComicMan:cool!!! 10/10 04:21
→ ComicMan:因為inverseA[a[i]] = i; 有一個inverseA[8] = 3; 10/10 04:22