В настоящее время у меня есть Map<int, dynamic>, где ключ — это порядок вставки.
Например
const Map<int, dynamic> log = {
1: {'startDate': 1111, 'endDate': 2222},
2: {'startDate': 123123, 'endDate': 1231233},
3: {'startDate': 555555, 'endDate': 5555556},
4: {'startDate': 888888},
};
Теперь, как я могу получить последнюю сумму X?
я думал о
final Iterable<int> numberOfLogs = log.keys;
final Iterable<int> reversedNumberOfLogs = numberOfLogs.toList().reversed;
final Iterable<int> recent2Logs = reversedNumberOfLogs.take(2);
И тогда я мог бы пройтись по recent2Logs, а затем получить доступ к log Map по циклическому индексу?
Есть лучший способ сделать это?
я смог сделать
final recent2Logs = log.keys.toList().getRange(log.length - 2, log.length));
Обратите внимание, что реализации Map и Set по умолчанию — это LinkedHashMap и LinkedHashSet соответственно, которые уже сохраняют для вас порядок вставки при повторении их. Воспользовавшись этим, чтобы получить Iterable последних n значений, вы можете сделать:
var lastValues = log.values.toList().reversed.take(n);
Если вы хотите, чтобы результат оставался Map с целочисленными ключами, то это будет:
var prunedLog = Map.fromEntries(log.entries.toList().reversed.take(n));
Обратите внимание, что оба приведенных выше примера будут возвращать элементы в порядке от самого последнего до самого последнего. Если вы хотите, чтобы они были в хронологическом порядке, вам придется снова изменить результат, например:
var prunedLog = Map.fromEntries(
log.entries.toList().reversed.take(n).toList().reversed);
Вау! Это намного лучше, чем я думал.