0

Is it any possibilities to sort the ObjectList object? For example:

  class MissPlane: object
{
    number  d_local
    object init(object self, number d)
    {
        d_local=d
        return self
    }
            number getD(object self)
    {
        return d_local
    }
    void print(object self)
    {
        result("d="+d_local+"\n")
    }

}
number h,k,l,hmax
hmax=2
result("start----------------"+datestamp()+"----------------------\n")

Object PlaneList
PlaneList=Alloc(ObjectList)
for(l=-hmax;l<=hmax;l++){
    for(k=-hmax;k<=hmax;k++){
        for(h=-hmax;h<=hmax;h++){
            Object MPObject=Alloc(MissPlane)
            MPObject.init(random())
            PlaneList.AddObjectToList(MPObject)
            MPObject.print()
        }
    }
}

And finally I need to sort it by d.

PS. ObjectList is not fully documented in the DM manual.

4

2 回答 2

1

您可以使用 DM 命令sort来实现TagListsObjectList的排序。在这两种情况下,您都必须创建一个“排序”类,该类定义了一个比较两个元素的方法,并在第二个元素大于第一个元素时返回。

以下示例用于 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()

这两个代码示例都可以从这个网站上找到。

于 2015-04-20T11:50:12.113 回答
0

以下示例创建一个简单的“冒泡排序”方法来对您的对象列表进行排序:

 class MissPlane: object
{
    number  d_local
    object init(object self, number d)
    {
        d_local=d
        return self
    }
            number getD(object self)
    {
        return d_local
    }
    void print(object self)
    {
        result("d="+d_local+"\n")
    }

}

object sortList( object in )
{
    object copy = in.ScriptObjectClone()    // Making a copy avoids messing with your original list...
    object sorted=Alloc(objectlist)

    while( copy.SizeOfList() )
    {
        object t = copy.ObjectAt(0)
        for (number c=1; c<copy.SizeOfList(); c++ )
        {
            if ( t.GetD() > copy.ObjectAt(c).GetD() ) 
                t = copy.ObjectAt(c);   // found a "smaller" object
        }
        sorted.AddObjectToList(t)   // add the smallest item found
        copy.RemoveObjectFromList(t)
    }

    return sorted
}

number h,hmax
hmax=20
result("start----------------"+datestamp()+"----------------------\n")

Object PlaneList
PlaneList=Alloc(ObjectList)
for(h=-0;h<hmax;h++){
    Object MPObject=Alloc(MissPlane)
    MPObject.init(random())
    PlaneList.AddObjectToList(MPObject)
}

result("start---------------- ORIGINAL ----------------------\n")
ForEach( object o; PlaneList )
    o.print()
Object sorted = sortList(PlaneList)
result("start---------------- SORTED ----------------------\n")
ForEach( object o; sorted)
    o.print()
于 2015-03-17T23:23:00.323 回答