作者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
1F:推 hpuser:请问inverseA的长度为什麽是9呢?想很久想不通@@? 10/10 03:10
2F:→ hpuser:不是才跑5次吗? 10/10 03:11
3F:推 ComicMan:cool!!! 10/10 04:21
4F:→ ComicMan:因为inverseA[a[i]] = i; 有一个inverseA[8] = 3; 10/10 04:22