在表格上显示排序结果 - Swift4

Posted

技术标签:

【中文标题】在表格上显示排序结果 - Swift4【英文标题】:Display Sorted Result on a Table - Swift4 【发布时间】:2018-11-06 19:58:02 【问题描述】:

我有

包含这些内容的地方

print(places)

Optional(Results<Place> <0x109526f30> (
    [0] Place 
        name = 127 Pine St;
        country = United States;
        lat = 42.63341130000001;
        lon = -71.33169049999999;
    ,
    [1] Place 
        name = 138 B St;
        country = United States;
        lat = 42.6285025;
        lon = -71.3288776;
    ,
    [2] Place 
        name = 16 Bagley Ave;
        country = United States;
        lat = 42.6344084;
        lon = -71.3378318;
    ,
    [3] Place 
        name = 27 Lane St;
        country = United States;
        lat = 42.6346452;
        lon = -71.32436559999999;
    ,
    [4] Place 
        name = 39 Cosgrove St;
        country = United States;
        lat = 42.61964890000001;
        lon = -71.3031683;
    ,
    [5] Place 
        name = 48 Houghton St;
        country = United States;
        lat = 42.6252232;
        lon = -71.3243308;
    ,
    [6] Place 
        name = 49 Coral St;
        country = United States;
        lat = 42.6359846;
        lon = -71.32655780000002;
    ,
    [7] Place 
        name = 59 Marriner St;
        country = United States;
        lat = 42.622121;
        lon = -71.31365679999999;
    
)) <<<

我还有另一个数组,我在内存中维护,看起来像这样

 print(distances)
 ["1.74", "1.45", "2.04", "1.50", "0.00", "1.15", "1.64", "0.56"]

结果

我的最终结果是这样的。


代码

这就是我渲染这张表的方式

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "customPlaceDetailCell", for: indexPath)
     as! CustomPlaceDetailCell

    if selectedPlace.name != nil 

        cell.address.text = (places![indexPath.row]["name"] as! String)
        cell.distance.text = distances[indexPath.row]

        if indexPath.row == activePlace 
            cell.address.isHidden = true
            cell.distance.isHidden = true
        

    

    return cell

我想要

显示我的结果按距离更近排序


注意:我的距离不是我的场所对象的一部分。我在运行时计算了它们。

如何去做这件事?

【问题讨论】:

使距离成为数据模型的一部分,用于填充表格。你只需要一个数组,而不是两个。 只对数组进行排序? @rmaddy 每个点之间的距离是动态计算的,而不是存储在数据库中。我认为没有必要存储它。 它没有说存储距离。您需要一个用于表格视图的单独数据模型。使用您从数据库加载的数据和您在运行时计算的数据的组合来填充它。 我告诉过你在另一个问题上只使用一个数组:***.com/questions/53174828/… 如您所见,如果您对places 进行排序,则需要以相同的方式对distances 进行排序。此外,还有很多关于排序的问题,您没有显示任何尝试。 【参考方案1】:

计算点之间的距离很昂贵。您应该只执行一次,或者如果您的数据发生更改。 排序是昂贵的。您应该只执行一次,或者如果您的数据发生更改。

尝试对 2 个不同的数组进行排序是个坏主意。

排序会多次比较数组中的项目。您需要一个地方来保存距离,以便对您的地方进行排序。

使您的 Place 对象成为具有方法和属性的 Struct,而不是 Dictionary

我会在你的数组中添加一个计算出的距离属性。还要添加一个internalDistance 属性,即Optional

如果计算距离属性的 getter 不为零,则返回 internalDistance,或者计算距离,将其保存到 internalDistance,如果为零则返回。

如果您更改目标点,则循环遍历地点数组并将所有internalDistance 变量清零,然后重新排序地点数组。

【讨论】:

【参考方案2】:

这样的事情应该是一种可能性。

override func viewDidAppear(_ animated : Bool)
super.viewDidAppear(animated)
 placeArray = zip(places,distance).sorted$0.1<$1.1.map$0.0

cell.address.text = (placeArray![indexPath.row]["name"] as! String)


如果你想要另一种可能更快的方法,你可以像这样对距离进行排序:

placeArray = distance.enumerated().sorted$0.element&lt;$1.element.mapplaces[$0.offset]

这需要一种距离作为索引。

【讨论】:

我试图在两个变量都可用后将它放在我的 viewDidLoad() 中。我得到了这个:i.imgur.com/ZJUGW8s.png Result 可以有一些方法,比如places.array 或places.objects?返回一个数组类型。那是核心数据吗? 让我试试你的第二个; 也许你需要一个 init 方法来转换数组结果,就像更新的那样。 这不是一个好的解决方案。 cellForRow 被多次调用。当您每次只需要一个值时,此代码将让您一次又一次地压缩和排序相同的数据。在开始时创建一个数组。排序一次。那么cellForRow 不需要做任何工作,除了从已经排序的数组中获取它需要的一个特定值。

以上是关于在表格上显示排序结果 - Swift4的主要内容,如果未能解决你的问题,请参考以下文章

如何从按对象创建日期排序的核心数据中获取结果?

HandsonTable 通过从 ajax 加载对数据进行排序

SQL多表联合查询按日期排序

怎么用JAVA把数据库查询结果显示在网页上

Swift4 Firebase 数据库排序不起作用

页面刷新后保留表格排序结果?