【问题标题】:Sort a list in Dart not the same as sorted list in SwiftDart 中的排序列表与 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;
   }
});

【问题讨论】:

  • 一个带有输入和预期/实际输出的具体示例会有所帮助。

标签: swift list sorting dart flutter


【解决方案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 取决于迭代中给定时间的元素。这有意义吗?
猜你喜欢
  • 2020-08-13
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2011-04-06
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
相关资源
最近更新 更多