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

标签 swift list sorting dart flutter

我已经在 iOS 版 Swift 中成功实现了排序算法。 (参见下面的代码)。

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

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

谁能解释一下 Swift 的 sorted 函数和 Dart 的 sort 函数之间的区别吗?为什么我的下面的代码片段在 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;
   }
});

最佳答案

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

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

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

  • 回调返回0 。在这种情况下AB相等
  • 回调返回一个数字 > 0 。这意味着A位于之后 B
  • 回调返回一个数字 < 0 。在这种情况下A位于之前 B .

关于swift - Dart 中的列表排序与 Swift 中的排序列表不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54278030/

相关文章:

ios - TableViewCell 中的 TableView 滚动问题

C++ 两个 n 大小的整数列表

python-3.x - 在切片上使用递归进行错误的冒泡排序;列表最终没有排序

java - 我在哪里排序?

java - 关于调查 "The Effect of Hardware Variances on the Performance of the Merge Sort Algorithm"的初步研究方法论的评论

ios - 使用 drawInRect 时 UIImage Aspect Fill?

ios - iOS 13 中的条形按钮色调颜色

ios - 如何根据消息的长度更改 messageCell 的宽度?在 swift 4

python - 使用 if 语句遍历列表

java - java中按子列表中的属性对列表进行排序