如何在列表中找到最接近的值,并返回更高的值?例如:列表[3,7,12,19],如果我的值是8,我怎么才能得到最近的(更大的)值12?我想在dart中使用这个逻辑。
kiayqfof1#
只需过滤List,只查找大于或等于您的数字的值,并获得最小值:
List
var n = 8; // Number to match var l = [3, 7, 12, 19]; // List of values var greater = l.where((e) => e >= n).toList()..sort(); //List of the greater values print(greater.first); // Print the first value. -> 12
pokxtpni2#
获取数字的最近值
import 'dart:math'; import 'dart:collection'; void main(){ List<double> value = [1,4,6,3,7,9,12,34,12,-12,-91]; print(value.getCloseValue(8)); // 7 print(value.getCloseValue(6)); // 6 print(value.getCloseValue(-11)); // -12 } extension on List<num> { num getCloseValue(num x) { if (isEmpty) return 0; Map<num, num> values = {}; forEach((e) { values[e] = (e - x).abs(); }); var sortedKeys = values.keys.toList(growable:false) ..sort((k1, k2) => values[k1]!.compareTo(values[k2]!)); final sortedMap = LinkedHashMap .fromIterable(sortedKeys, key: (k) => k, value: (k) => values[k]); return sortedMap.keys.first; } }
k4emjkb13#
List<int> arr = [6, 12, 11, 18, 24,5,6,99,10,9]; arr.sort((a, b) => a.compareTo(b)); print(arr); print(Utils.getNextLargerNumber(8, arr));
其逻辑如下:
static int getNextLargerNumber(int number, List<int> array) { for (var i = 0; i < array.length; i++) { if (number < array[i]) { return array[i]; } } return -1; }
vh0rcniy4#
Mattia的答案已经足够好了。(尽管列表的长度不能为0,而且可能效率不高,因为您有一个where()和sort())。下面是一个不同的方法,它解决了这些问题:
where()
sort()
final nearestLarger = list.isEmpty ? null : list.reduce( (a, b) => (a-target).abs() < (b -target).abs() ? a : b);
final nearestSmaller = list.isEmpty ? null : list.reduce( (a, b) => (a-target).abs() <= (b -target).abs() ? a : b);
请注意,两个函数都检索最接近目标的值,但在不明确的情况下(如[3,4,5]),较大或较小的值优先。
4条答案
按热度按时间kiayqfof1#
只需过滤
List
,只查找大于或等于您的数字的值,并获得最小值:pokxtpni2#
获取数字的最近值
k4emjkb13#
其逻辑如下:
vh0rcniy4#
Mattia的答案已经足够好了。(尽管列表的长度不能为0,而且可能效率不高,因为您有一个
where()
和sort()
)。下面是一个不同的方法,它解决了这些问题:最接近目标值(较大优先)
最接近目标值(较小优先)
请注意,两个函数都检索最接近目标的值,但在不明确的情况下(如[3,4,5]),较大或较小的值优先。