0

我有一个ArrayCollection用作列表的数据提供者。

该集合存储类型的对象MyObject

public class MyObject {
    public var myMap:Dictionary;
}

myMap存储键值对,键是 an integer,值是字符串。

到目前为止的约束。我现在要做的是根据地图的字段对集合进行排序。

使用我自己ArrayCollection的函数确实有效。这就是我实现它的方式:sortcompareFunction

    var key:int = 15;
    var sort:Sort = new Sort();
    sort.compareFunction = fidSort;
    myCollection.sort = sort;
    myCollection.refresh();

    private function fidSort(a:Object, b:Object, fields:Array = null):int {
        if(a.myMap[key].fieldValue == b.myMap[key].fieldValue) {
            return 0;
        } else if(a.myMap[key].fieldValue > b.myMap[key].fieldValue) {
            return 1;
        } else{
            return -1;
        }
    }

正如我所说,这确实是为了排序。然而,排序(作为集合的一个属性)自然会保留在集合中,除非特别从其中删除,这意味着每次映射中的值MyObject发生变化时,它将根据比较函数进行排序。

我需要的是只应用一次排序,之后地图值发生的事情不应该改变集合排序。

我已经尝试过禁用colleciton上的自动更新之类的东西(自然这将不起作用,因为集合不再获得任何更新(确实如此,但它们仅被缓存))。之后,我阅读了这篇关于对底层数组进行排序的文章。但是,这似乎不适用于地图,因为我确实收到一个编译错误,说myMap[key].fieldValueMyObject.

所以,是的,我在这里有点迷失在太空中。如果有人知道如何实现这一点,非常基本的任务,请告诉我。

干杯!

4

1 回答 1

2

明白了,为了完整起见,我想自己回答这个问题。

如前所述,使用myCollection.toArray().sort(fidSort)并没有完全起作用。在这一步中创建的数组确实已经排序,但是集合没有得到排序,即使refresh()已被调用。

为了解决这个问题,我们需要直接使用集合的源(当然是一个数组)并对该数组进行排序,而不是从集合中创建一个新数组;

  collection.source.sort(fidSort);
  collection.refresh();

由于我们仍然只对数组进行排序而不将其Sort应用于集合本身,因此集合只排序一次,而不管它的数据是否更新。

collection编辑:只是为了踢球,在对' 的基础数组进行排序时,无法立即恢复原始项目位置,就像在ArrayCollection直接对 an 应用排序并将其设置为 null 以恢复位置时所做的那样。简单的解决方案是预先缓存数组项索引。

于 2012-11-16T08:33:09.733 回答