Как назначить каждый элемент с ключами на карте - PullRequest
0 голосов
/ 12 февраля 2020

Я храню (не личные) данные в списке строк, которым пользователь дает значения после выполнения действия.

Поскольку в списке приведены значения только после выполнения действия пользователем Я не знаю, сколько предметов будет.

Я пытаюсь отсортировать этот список по двум типам данных:

Strings и DateTime

Я пытался преобразовать список в карту, но я не уверен, как назначить каждому элементу ключи «имя приложения» и «длительности». Как бы вы это сделали?

Пожалуйста, предложите лучший способ решения этой проблемы, если таковой имеется?

*** Обновлено

Пример данных:

YouTube
1h 20m on screen - 2m background
1h 22m
Chrome
1h 26m on screen - 10m background
1h 36m
Google Maps
3h 4m on screen - 2h 54m background
5h 58m

Данные хранятся с использованием окончательного List<String> _usage.

** Обновление: добавлен пример того, какие данные должны быть проанализированы и как получить к ним доступ.

Я ищу для анализа эти данные как json:

  {"app": "YouTube", "duration": "1h 22m"}, 
  //Removes the'1h 20m on screen - 2m background'

  {"app": "Chrome", "duration": "1h 36m"},
  //Removes the '1h 26m on screen - 10m background'

  {"app": "Google Maps", "duration": "5h 58m")"}
  //Removes the '3h 4m on screen - 2h 54m background'

Я бы предпочел получить к ним доступ через тип Map или HashMap.

1 Ответ

0 голосов
/ 12 февраля 2020

Полагаю, вы могли бы сделать что-то подобное, но трудно сделать стабильное решение, не зная всех подводных камней в данных. Например, я предполагаю, что мы всегда можем гарантировать, что имя приложения будет стоять первым, а затем в какой-то момент времени:

List<String> _usage = [
  'YouTube',
  '1h 20m on screen - 2m background',
  '1h 22m',
  'Chrome',
  '1h 26m on screen - 10m background',
  '1h 36m',
  'Google Maps',
  '3h 4m on screen - 2h 54m background',
  '5h 58m'
];

void main(List arguments) {
  final map = <String, Duration>{};

  for (var i = 0; i < _usage.length; i += 3) {
    final app = _usage[i];
    final duration = _parseDuration(_usage[i + 2]);

    if (map.containsKey(app)) {
      map[app] += duration;
    } else {
      map[app] = duration;
    }
  }

  // {YouTube: 1:22:00.000000, Chrome: 1:36:00.000000, Google Maps: 5:58:00.000000}
  print(map);
}

final _regExp = RegExp(r'(?<hours>\d+)h (?<minutes>\d+)m');
Duration _parseDuration(String line) {
  final match = _regExp.firstMatch(line);

  if (match == null) {
    throw Exception('Could not get duration from: $line');
  }

  return Duration(
      hours: int.parse(match.namedGroup('hours')),
      minutes: int.parse(match.namedGroup('minutes')));
}

Я также добавил к решению, поэтому, если появится то же имя приложения, мы добавим длительность вместо перезаписи предыдущего значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...