Dart - get the nearest(larger) value from List?

Viewed 1793

How can I find the closest value in a list, which will return me the higher value? Example: List of [3,7,12,19] if my value is 8 how can I get the nearest(larger) value 12? i want this logic in dart.

4 Answers

Just filter the List only for the values higher or equal to your number and get the lowest value:

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
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));

and below is the logic:

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;
  }

Mattia's answer is already good enough. (although the list cant have the length 0 and it might be not as efficient, as you have a where() as well as sort() in there). Here is a different approach, that solves those concerns:

Nearest-Larger value

final nearestLarger = list.isEmpty ? null : list.reduce(
      (a, b) => (a-target).abs() < (b -target).abs() ? a : b);

Nearest-Smaller value

final nearestSmaller = list.isEmpty ? null : list.reduce(
      (a, b) => (a-target).abs() <= (b -target).abs() ? a : b);

To get Closest Value of number

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;
  }
}
Related