You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:01:25