如何删除重复的名称?
How can I remove duplicate names?
考虑以下代码:
以下代码以这种格式打印处理器名称:
DC5,DR2,DR3
但是当涉及到重复时,它打印为 DR3DR3。
我需要删除重复的处理器名称。我想不通,我该怎么做?
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;
}
如果你想从结果中删除重复的条目,你应该这样做:
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
包含找到的以前的处理器名称,如果在下一个检索到的处理器名称中有匹配项,它将被跳过,否则添加到字典和结果字符串中。
我正在使用更面向对象的方法。
这看起来有点复杂:
public function processorNameFormat(item:Object, column:GridColumn):String
{
if (!(item is ProcessOrderDO)) {
return "";
}
如果您的函数仅适用于特定类型的参数,为什么不简单地将参数声明为该类型?
public function processorNameFormat(item:ProcessOrderDO, column:GridColumn):String
这个函数主要是对参数中传递给它的这个对象进行操作。在这种情况下,将此函数作为方法添加到对象的 class 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循环的工作是跟踪当前元素是否是最后一个元素,以省略末尾的分隔符。我认为在每次迭代中添加分隔符更容易,并且 "subtract" 最后添加多余的分隔符。
保持列表元素唯一的一种方法是使用一个数据结构来跟踪它。在as3中,泛型对象的属性都是String类型,并且是唯一的。
这里有一些 class 可以做到这一点:
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 class。
我希望代码是不言自明的。
代码中有什么不清楚的地方,请在评论中提问。
我假设 DO
代表数据对象,它通常不包含任何功能。但这是 IMO 属于这些对象的功能,因此应该在它们的 classes 中声明。
考虑以下代码:
以下代码以这种格式打印处理器名称: DC5,DR2,DR3 但是当涉及到重复时,它打印为 DR3DR3。 我需要删除重复的处理器名称。我想不通,我该怎么做?
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;
}
如果你想从结果中删除重复的条目,你应该这样做:
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
包含找到的以前的处理器名称,如果在下一个检索到的处理器名称中有匹配项,它将被跳过,否则添加到字典和结果字符串中。
我正在使用更面向对象的方法。
这看起来有点复杂:
public function processorNameFormat(item:Object, column:GridColumn):String
{
if (!(item is ProcessOrderDO)) {
return "";
}
如果您的函数仅适用于特定类型的参数,为什么不简单地将参数声明为该类型?
public function processorNameFormat(item:ProcessOrderDO, column:GridColumn):String
这个函数主要是对参数中传递给它的这个对象进行操作。在这种情况下,将此函数作为方法添加到对象的 class 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循环的工作是跟踪当前元素是否是最后一个元素,以省略末尾的分隔符。我认为在每次迭代中添加分隔符更容易,并且 "subtract" 最后添加多余的分隔符。
保持列表元素唯一的一种方法是使用一个数据结构来跟踪它。在as3中,泛型对象的属性都是String类型,并且是唯一的。
这里有一些 class 可以做到这一点:
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 class。
我希望代码是不言自明的。 代码中有什么不清楚的地方,请在评论中提问。
我假设 DO
代表数据对象,它通常不包含任何功能。但这是 IMO 属于这些对象的功能,因此应该在它们的 classes 中声明。