您可以使用 DM 命令sort
来实现TagLists或ObjectList的排序。在这两种情况下,您都必须创建一个“排序”类,该类定义了一个比较两个元素的方法,并在第二个元素大于第一个元素时返回。
以下示例用于 TagLists,将数字 tagList 排序为具有递增的数字。
Class Sorter
{
// The signature of the following method must not be changed.
Number Bigger( Object self, TagGroup TG1, Number index1, TagGroup TG2, Number index2 )
{
Number N1, N2
TG1.TagGroupGetIndexedTagAsNumber( index1, N1 )
TG2.TagGroupGetIndexedTagAsNumber( index2, N2 )
return (N1<N2)?1:0
}
}
TagGroup CreateRandomList( Number n )
{
TagGroup list = NewTagList()
For ( Number i = 0 ; i < n ; i++ )
list.TagGroupInsertTagAsNumber( i, Random() )
return list
}
void Main()
{
TagGroup unsorted = CreateRandomList( 10 )
unsorted.TagGroupOpenBrowserWindow( "unsorted", 0 )
Object sortObject = Alloc( Sorter )
Sort( 0, unsorted, sortObject, "Bigger" ) // The first parameter specifies ‘stable’ search
unsorted.TagGroupOpenBrowserWindow( "sorted", 0 )
}
Main()
下一个示例是针对 ObjectLists 的,对 objectList 进行排序。在这种情况下,列表的对象只是“包装的数字”,并且排序再次实现了增加的数字。
class MyObject
{
Number value
Object Init( Object self, Number in ) { value = in; return self; }
Number Get( Object self ) { return value; }
}
Class Sorter
{
// The signature of the following method must not be changed.
Number HigherValue( Object self, Object obj1, Object obj2 )
{
return ( obj1.Get() < obj2.Get() ) ? 1 : 0
}
}
Object CreateRandomList( Number n )
{
Object obList = Alloc(ObjectList)
For ( Number i = 0 ; i < n ; i ++ )
{
Object newOBJ = Alloc(MyObject).Init( Random() )
obList.AddObjectToList( newOBJ )
}
return obList
}
void PrintObjects( Object obList )
{
ForEach( Object ob; obList )
Result( "value:" + ob.Get() + "\n" )
}
void Main()
{
Object unsorted = CreateRandomList( 7 )
Result( "\nBefore sort:\n" )
unsorted.PrintObjects()
Result( "\nAfter sort:\n" )
Sort( 0, unsorted, Alloc(Sorter), "HigherValue" )
unsorted.PrintObjects()
}
Main()
这两个代码示例都可以从这个网站上找到。