Flash as3如何删除数组中的重复项?

mhe*_*ers 5 flash actionscript actionscript-3

嗨,我只是在flash中有一个名称(字符串)数组,我想确保删除数组中的任何重复项,或者至少在数组中每个重定位值只执行一次函数.

Ada*_*ith 18

很多种方法.您可以对数组进行排序并迭代它,忽略与上一次迭代匹配的条目.或者您可以使用indexOf()来搜索重复项.或者您可以对数组进行一次传递,构建一个键入字符串的字典(并忽略已经有条目的键).

这是字典方式,每个唯一条目的内存成本为1布尔值,当你期望大量的欺骗时,内存容易,而且速度快.如果你有相对较少的欺骗,连续欺骗的排序+剔除可能更有效

import flash.utils.Dictionary;

var array:Array = ["harry","potter","ron","harry","snape","ginny","ron"];
var dict:Dictionary = new Dictionary();

for (var i:int = array.length-1; i>=0; --i)
{
    var str:String = array[i] as String;
    trace(str);
    if (!dict[str])
    {
        dict[str] = true;
    }
    else
    {
        array.splice(i,1);
    }
}

dict = null;


trace(array);
Run Code Online (Sandbox Code Playgroud)

这是一种排序方式,但请注意:这不是保留订单!你没有说这是否重要.但是因为它使用快速排序,它确实倾向于具有O(N log N)性能加上一次额外通过,除非你的数据当然是病态的.

var array:Array = ["harry","potter","ron","harry","ron","snape","ginny","ron"];

array.sort();
trace(array);

for (var i:int = array.length-1; i>0; --i)
{
    if (array[i]===array[i-1])
    {
        array.splice(i,1);
    }
}


trace(array);
Run Code Online (Sandbox Code Playgroud)

除了没有说明订单是否重要之外,你没有说是否留下了哪些欺骗:最低指数或最后找到的那个.如果这很重要,您将需要重新排序我的字典示例以反向运行.我从最后开始,因为这样就可以在不使循环计数无效的情况下进行拼接(即通过在循环期间更改array.length)如果顺序很重要,则按常规正向循环并复制出每个字符串的第一次出现到一个新的数组,或修改这样的循环计数器.这可能是我使用的技术,因为它保留了顺序并保留了每个字符串的第一个遇到的实例:

import flash.utils.Dictionary;

var array:Array = ["harry","potter","ron","harry","snape","ginny","ron"];
var dict:Dictionary = new Dictionary();

var len:int = array.length;
for (var i:int = 0; i<len; ++i)
{
    var str:String = array[i] as String;
    if (!dict[str])
    {
        dict[str] = true;
    }
    else
    {
        array.splice(i,1);
        i--; len--;
    }
}

dict = null;


trace(array);
Run Code Online (Sandbox Code Playgroud)


Lar*_*sjö 5

更多猫皮肤:

var a:Array = ["Tom", "John", "Susan", "Marie", "Tom", "John", "Tom", "Eva"];
a.sort();
var i:int = 0;
while(i < a.length) {
    while(i < a.length+1 && a[i] == a[i+1]) {
        a.splice(i, 1);
    }
    i++;
}
Run Code Online (Sandbox Code Playgroud)


dim*_*iax 5

好答案!

我检查了其中的一些,与我的相比,它们的效果更差。例:

const origin: Vector.<String> = Vector.<String>(["a", "c", "d", "c", "b", "a", "e", "b", "a"]);

function getUniqueVector(origin: Vector.<String>): Vector.<String> {
    const n: uint = origin.length;
    var res: Vector.<String> = new Vector.<String>();
    var i: int = 0;

    while(i < n) {
        var el: String = origin[i];
        if(res.indexOf(el) == -1) res.push(el);
        i += 1;
    }

    return res;
}

trace(getUniqueVector(origin)); // unique elements vector
Run Code Online (Sandbox Code Playgroud)

我的数据统计:

切入方法:8946ms,8718ms,8936ms

目标进近:88​​00ms,8809ms,8769ms

我的旧方法:8723ms,8599ms,8700ms

这种方法:6771ms,6867ms,6706ms


更新02 /七月/ 2019

值得一提的是,要获得更好的性能,请创建对象并在其中设置每个推入的值作为检索O(1)复杂度的关键,因此结果会好一些。

但是Flash已经死了,可能还死了ActionScript,所以这是葬礼上的讲话:(