Как я могу получить последние N элементов в Map<int, dynamic>?

В настоящее время у меня есть 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 по циклическому индексу?

Есть лучший способ сделать это?

2
0
1 079
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

я смог сделать

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

Вау! Это намного лучше, чем я думал.

DanMossa 21.12.2020 20:58

Другие вопросы по теме