我試圖撰寫一個遞回快速排序演算法。問題是它回傳一組嵌套陣列中的元素
void main(List<String> arguments) {
List myList = [2, 4, 9, 7, 1, 12];
print(quickSort(myList));
}
List quickSort(var arr){
if (arr.length < 2){
return arr;
} else {
int pivot = arr[0];
List less = [];
List greater = [];
arr.removeAt(0);
arr.forEach((element) {
if (element > pivot){
greater.add(element);
} else {
less.add(element);
}
});
return [quickSort(less), pivot, quickSort(greater)];
}
}
這是演算法 [[1], 2, [[], 4, [[7], 9, [12]]]] 演算法的結果
我想以這種格式獲取資料: [1, 2, 4, 7, 9, 12]
uj5u.com熱心網友回復:
有一個問題是您的問題的主要原因。但是也有多個相關的問題是什么時候你沒有發現主要問題的原因。
主要問題是您在以下位置插入串列而不是回傳串列的內容:
return [quickSort(less), pivot, quickSort(greater)];
您在這里想要的是從 eg 的回傳串列中插入所有元素quickSort(less)。相反,您將它作為 List 本身插入,這使您的匯入就像您看到的一樣。
為了解決這個問題,你應該...告訴 Dart 它應該遍歷串列并插入所有元素。所以是這樣的:
return [...quickSort(less), pivot, ...quickSort(greater)];
您遇到此問題的原因是您的代碼中通常缺少型別。一般來說,你不應該只寫List,因為這意味著List<dynamic>在 Dart 中。dynamic表示任何型別,因此List允許包含多種型別。這很糟糕,因為這也意味著從這些資料中提取資料List也是如此dynamic,因此 Dart 無法幫助我們防止型別問題。
我已經重寫了您的代碼,以使其在此處更安全:
void main(List<String> arguments) {
List<int> myList = [2, 4, 9, 7, 1, 12];
print(quickSort(myList));
}
List<int> quickSort(List<int> arr) {
if (arr.length < 2) {
return arr;
} else {
int pivot = arr[0];
List<int> less = [];
List<int> greater = [];
arr.removeAt(0);
for (final element in arr) {
if (element > pivot) {
greater.add(element);
} else {
less.add(element);
}
}
return [...quickSort(less), pivot, ...quickSort(greater)];
}
}
另外,我建議不要使用.forEach(),而是像我所做的那樣使用普通的 for-each 回圈。
最后,這也是型別安全的,因為我們可以使用var/final告訴 Dart 它應該根據背景關系自動找出正確的型別。但是,當涉及到方法簽名時,您仍然應該指定型別:
void main(List<String> arguments) {
final myList = [2, 4, 9, 7, 1, 12];
print(quickSort(myList));
}
List<int> quickSort(List<int> arr) {
if (arr.length < 2) {
return arr;
} else {
final pivot = arr[0];
final less = <int>[];
final greater = <int>[];
arr.removeAt(0);
for (final element in arr) {
if (element > pivot) {
greater.add(element);
} else {
less.add(element);
}
}
return [...quickSort(less), pivot, ...quickSort(greater)];
}
}
所以關鍵是如果你要在 Dart 中指定型別,那么請寫完整的型別,因為在大多數情況下justList比final/差得多。var:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/495649.html
上一篇:無法從'void'轉換為'System.Collections.Generic.Dictionary<string,bool>'
下一篇:可變引數模板函式中的靜態變數
