如何删除重复的名称?

时间:2015-05-22 09:49:05

标签: actionscript-3 flash flex actionscript arraycollection

考虑以下代码:

下面的代码以这种格式打印processorName: DC5,DR2,DR3 但是当涉及到重复时,它会打印为DR3DR3。 我需要删除重复的processorName。我无法理解,我该怎么做?

 public function processorNameFormat(item:Object, column:GridColumn):String
{
    var processorNames:String = "";
    if (!(item is ProcessOrderDO)) {
        return "";
    }
    var poDestReqList:ArrayCollection = item.processOrderDestinationRequirementDOList ;

    for each(var destReq:ProcessOrderDestinationRequirementDO in poDestReqList)
    {
        if(destReq.processorOID == (poDestReqList[poDestReqList.length-1] as ProcessOrderDestinationRequirementDO).processorOID)
            processorNames +=  destReq.processorName ;
        else
            processorNames +=  destReq.processorName+"," ;
    }
    return processorNames;
}

2 个答案:

答案 0 :(得分:0)

如果要从结果中删除重复的条目,您应该这样做:

public function processorNameFormat(item:Object, column:GridColumn):String
{
    var processorNames:String = "";
    if (!(item is ProcessOrderDO)) {
        return "";
    }
    var d:Dictionary=new Dictionary();
    var poDestReqList:ArrayCollection = item.processOrderDestinationRequirementDOList ;

    for each(var destReq:ProcessOrderDestinationRequirementDO in poDestReqList)
    {
        var s:String=destReq.processorName;
        if (d[s]) continue;
        d[s]=true; // fill the dictionary with values to catch duplicates
        if (processorNames=="")
            processorNames +=  destReq.processorName ;
        else
            processorNames +=  ","+destReq.processorName;
    }
    return processorNames;
}

你创建一个Dictionary包含找到的以前的处理器名称,如果在下一个检索到的处理器名称中有匹配,它将被跳过,否则将被添加到字典和结果字符串中。

答案 1 :(得分:0)

我使用更面向对象的方法。

这看起来有点过于复杂:

public function processorNameFormat(item:Object, column:GridColumn):String
{
    if (!(item is ProcessOrderDO)) {
        return "";
}

如果您的函数仅适用于某种类型的参数,为什么不简单地将参数声明为该类型?

public function processorNameFormat(item:ProcessOrderDO, column:GridColumn):String

此函数主要对参数中传递给它的这一个对象进行操作。在这种情况下,将此函数作为方法添加到对象的类ProcessOrderDO

public function processorNameFormat(column:GridColumn):String

这简化了代码:

public function processorNameFormat(column:GridColumn):String
{
    var processorNames:String = "";

    for each(var destReq:ProcessOrderDestinationRequirementDO in processOrderDestinationRequirementDOList)
    {
        if(destReq.processorOID == (processOrderDestinationRequirementDOList[processOrderDestinationRequirementDOList.length-1] as ProcessOrderDestinationRequirementDO).processorOID)
            processorNames +=  destReq.processorName ;
        else
            processorNames +=  destReq.processorName+"," ;
    }
    return processorNames;
}

看起来这个for循环的工作是跟踪当前元素是否是最后一个元素,以省略末尾的分隔符。我认为在每次迭代中添加分隔符更容易,并且减去"最后多余的一个。

保持列表元素唯一的一种方法是使用跟踪它的数据结构。在as3中,泛型对象的属性是String类型且唯一。

这是一个小课程:

class StringSet
{
    private var strings:Object = {};
    private var delimiter:String;

    public function StringSet(delimiter:String = ", ")
    {
        this.delimiter = delimiter;
    }

    public function put(element:String):void
    {
        strings[element] = 0;    
    }

    public function toString():String
    {
        var result:String = "";

        for (var string:String in strings)
            result += string + delimiter;

        return result.substring(0, result.length - delimiter.length);
    }
}

有了这个,代码现在看起来像这样:

public function processorNameFormat(column:GridColumn):String
{
    var processorNames:StringSet = new StringSet();

    for each(var destReq:ProcessOrderDestinationRequirementDO in processOrderDestinationRequirementDOList)
    {
        processorNames.put(destReq.processorName);
    }
    return processorNames;
}

列出名称并确保它们是唯一的所有内务处理现在都在StringSet类中。

我希望代码是自我解释的。 如果任何代码不清楚,请在评论中提问。

我假设DO代表数据对象,它通常不包含任何功能。但这是IMO属于这些对象的功能,因此应在其类中声明。