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 种不同的东西。
比较A
和B
,我们有3种可能性:
0
。在这种情况下,A
和 B
相等
回调返回一个数字> 0
。这意味着A
被放置在之后 B
回调返回一个数字< 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
必须转换为回调返回 < 0
我猜 - 并且 false
必须是 0
或 > 0
或 < 0
取决于迭代中给定时间的元素。这有意义吗?以上是关于Dart 中的排序列表与 Swift 中的排序列表不同的主要内容,如果未能解决你的问题,请参考以下文章