Flutter中如何查找列表中大于指定double值且最接近的首个元素?
在Flutter中查找列表中首个大于指定值且最接近的元素
给定的double类型列表:
[0.017, 0.068, 0.831, 1.034, 1.475, 1.593, 1.746, 2.017, 2.305, 2.695, 3.051, 3.339, 3.627, 3.763, 3.915, 3.966, 4.644, 4.949, 5.085, 5.203, 5.644, 6.136, 6.271, 6.542, 6.712, 7.085, 7.271, 7.661, 7.831, 8.085, 8.390, 8.915, 9.034, 9.492, 9.508, 9.898, 10.271, 10.610, 10.932, 11.169, 11.203, 11.729, 12.186, 12.288, 12.305, 12.644, 13.051, 13.407, 13.458, 13.729, 14.102, 14.525, 14.542, 14.831, 15.136, 15.559, 15.661, 16.169, 16.220, 16.763, 16.780, 17.119, 17.339, 17.390, 18.254, 18.322, 18.525, 18.746]
目标值:
0.905
解决方案
情况1:列表已按升序排列
观察给定列表是升序排列的,因此直接遍历找到第一个大于目标值的元素即可——因为列表升序,后续元素只会更大,这个元素就是最接近目标值的。
实现代码:
void main() { List<double> numbers = [0.017, 0.068, 0.831, 1.034, 1.475, 1.593, 1.746, 2.017, 2.305, 2.695, 3.051, 3.339, 3.627, 3.763, 3.915, 3.966, 4.644, 4.949, 5.085, 5.203, 5.644, 6.136, 6.271, 6.542, 6.712, 7.085, 7.271, 7.661, 7.831, 8.085, 8.390, 8.915, 9.034, 9.492, 9.508, 9.898, 10.271, 10.610, 10.932, 11.169, 11.203, 11.729, 12.186, 12.288, 12.305, 12.644, 13.051, 13.407, 13.458, 13.729, 14.102, 14.525, 14.542, 14.831, 15.136, 15.559, 15.661, 16.169, 16.220, 16.763, 16.780, 17.119, 17.339, 17.390, 18.254, 18.322, 18.525, 18.746]; double target = 0.905; double? result; for (var num in numbers) { if (num > target) { result = num; break; // 找到第一个符合条件的元素就终止遍历 } } print(result); // 输出: 1.034 }
情况2:列表未排序
如果列表无序,需要先筛选出所有大于目标值的元素,再从中找出最小值(即最接近目标值的元素)。
实现代码:
void main() { List<double> numbers = [0.017, 0.068, 0.831, 1.034, 1.475, 1.593, 1.746, 2.017, 2.305, 2.695, 3.051, 3.339, 3.627, 3.763, 3.915, 3.966, 4.644, 4.949, 5.085, 5.203, 5.644, 6.136, 6.271, 6.542, 6.712, 7.085, 7.271, 7.661, 7.831, 8.085, 8.390, 8.915, 9.034, 9.492, 9.508, 9.898, 10.271, 10.610, 10.932, 11.169, 11.203, 11.729, 12.186, 12.288, 12.305, 12.644, 13.051, 13.407, 13.458, 13.729, 14.102, 14.525, 14.542, 14.831, 15.136, 15.559, 15.661, 16.169, 16.220, 16.763, 16.780, 17.119, 17.339, 17.390, 18.254, 18.322, 18.525, 18.746]; double target = 0.905; // 筛选所有大于目标值的元素 List<double> candidates = numbers.where((num) => num > target).toList(); if (candidates.isNotEmpty) { // 找出最小的元素,即最接近目标值的 double result = candidates.reduce((a, b) => a < b ? a : b); print(result); // 输出: 1.034 } else { print("没有找到大于目标值的元素"); } }
说明
- 升序列表的解法效率更高,时间复杂度为O(n),找到第一个符合条件的元素就终止遍历。
- 无序列表的解法先筛选再找最小值,时间复杂度同样为O(n),但需要遍历整个列表两次(筛选+找最小值)。
内容的提问来源于stack exchange,提问作者viki
相关产品推荐
相关产品推荐

