Dart 中的排序列表与 Swift 中的排序列表不同

Posted

技术标签:

【中文标题】Dart 中的排序列表与 Swift 中的排序列表不同【英文标题】:Sort a list in Dart not the same as sorted list in Swift 【发布时间】:2019-06-14 03:19:21 【问题描述】:

我已经在 Swift for ios 中成功实现了一个排序算法。 (见下面的代码)。

现在,我想在 Dart for Flutter 中实现相同的算法。

而且我必须意识到我的试用版(见下文)与 Swift 代码不同。为什么????

谁能解释一下 Swift 的 sorted 函数和 Dart 的 sort 函数之间的区别?为什么我下面的 code-sn-ps 在 Swift 和 Dart 中没有做同样的事情???

这是 Swift 代码:

return stationItems.sorted 
    let nameA = $0.name!
        .replacingOccurrences(of: ",", with: "", options: .literal, range: nil)
        .replacingOccurrences(of: "ä", with: "a", options: .literal, range: nil)
        .replacingOccurrences(of: "ö", with: "o", options: .literal, range: nil)
        .replacingOccurrences(of: "ü", with: "u", options: .literal, range: nil)
        .lowercased()
    let nameB = $1.name!
        .replacingOccurrences(of: ",", with: "", options: .literal, range: nil)
        .replacingOccurrences(of: "ä", with: "a", options: .literal, range: nil)
        .replacingOccurrences(of: "ö", with: "o", options: .literal, range: nil)
        .replacingOccurrences(of: "ü", with: "u", options: .literal, range: nil)
        .lowercased()
    let searchTermy = searchTerm
        .replacingOccurrences(of: ",", with: "", options: .literal, range: nil)
        .replacingOccurrences(of: "ä", with: "a", options: .literal, range: nil)
        .replacingOccurrences(of: "ö", with: "o", options: .literal, range: nil)
        .replacingOccurrences(of: "ü", with: "u", options: .literal, range: nil)
        .lowercased()

    if nameA == searchTermy && nameB != searchTermy 
        return true
     else if nameA.hasPrefix(searchTermy) && !nameB.hasPrefix(searchTermy)  
        return true
     else if nameA.contains(searchTermy) && !nameB.contains(searchTermy) 
        return true
     else 
        let n = searchTermy.count
        for i in 0..<searchTermy.count 
            if nameA.hasPrefix(String(searchTermy[..<(n-i)])) && !nameB.hasPrefix(String(searchTermy[..<(n-i)])) 
                return true
             else 
                return false
            
        
        return false
    

这是 Dart 代码:

return stationList.sort((a, b) 
   var nameA = a.stopName
      .replaceAll(RegExp(','), '')
      .replaceAll(RegExp('ä'), 'a')
      .replaceAll(RegExp('ö'), 'o')
      .replaceAll(RegExp('ü'), 'u')
      .toLowerCase();
   var nameB = b.stopName
      .replaceAll(RegExp(','), '')
      .replaceAll(RegExp('ä'), 'a')
      .replaceAll(RegExp('ö'), 'o')
      .replaceAll(RegExp('ü'), 'u')
      .toLowerCase();
   var searchTermy = stationName
      .replaceAll(RegExp(','), '')
      .replaceAll(RegExp('ä'), 'a')
      .replaceAll(RegExp('ö'), 'o')
      .replaceAll(RegExp('ü'), 'u')
      .toLowerCase();
   if ((nameA == searchTermy) && (nameB != searchTermy)) 
      return 1;
    else if (nameA.startsWith(searchTermy) && !nameB.startsWith(searchTermy)) 
      return 1;
    else if (nameA.contains(searchTermy) && !nameB.contains(searchTermy)) 
      return 1;
    else 
      var n = searchTermy.length;
      for (int i = 0; i < searchTermy.length; i++) 
        if (nameA.startsWith(searchTermy.substring(0, (n - i))) && !nameB.startsWith(searchTermy.substring(0, (n - i)))) 
          return 1;
        else 
          return 0;
       
     
     return 0;
   
);

【问题讨论】:

一个带有输入和预期/实际输出的具体示例会有所帮助。 【参考方案1】:

true/false 与这里的 0/1 不同。

Dart 排序检查 3 种不同的东西。

比较AB,我们有3种可能性:

回调返回0。在这种情况下,AB 相等 回调返回一个数字&gt; 0。这意味着A 被放置在之后 B 回调返回一个数字&lt; 0。在这种情况下,A 被放置在之前 B

【讨论】:

谢谢你,雷米。我也看到了。但我想,我不明白的是为什么即使我返回 0,我的 Dart-List 也会改变。或者换句话说,为什么下面的列表会静音,而不是保持原样:stationList.sort((a, b) return 0; ); sort 就是这样工作的。它不会创建新列表,而是对现有列表进行排序。首先,sort 什么都不返回。 啊,它开始变得有意义了...... Swift 中的 true/false 意味着遍历列表 - 给定迭代时刻的元素($0 和 $1)要么是 mutated in position (如果为真:A 放在 B 之前)或 kept in position(如果为假)。 在 Dart 中,sort 的工作方式不同,遍历列表不能有与 Swift 的 sorted 相同的双重决策,而是需要如上所述的三态实现。 true 必须转换为回调返回 &lt; 0 我猜 - 并且 false 必须是 0&gt; 0&lt; 0 取决于迭代中给定时间的元素。这有意义吗?

以上是关于Dart 中的排序列表与 Swift 中的排序列表不同的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dart 中按“枚举”对列表进行排序?

如何根据 Dart 中的 int 属性对所有 Class 属性进行排序?

如何按另一个列表对列表进行排序

对列表的多个子列表进行排序以创建新列表,Dart

Dart 中的 List.shuffle()?

如何在 Dart 中对列表进行排序? [复制]