Как подсчитать количество элементов в списке

#list #dart

#Список #dart

Вопрос:

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

 var elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];
  

Я хочу получить результат, подобный:

 {
  "a": 3,
  "b": 2,
  "c": 2,
  "d": 2,
  "e": 2,
  "f": 1,
  "g": 1,
  "h": 3
}
  

Я провел некоторое исследование и нашел решение на JavaScript, но я не знаю, как перевести его на Dart.

 var counts = {};
your_array.forEach(function(x) { counts[x] = (counts[x] || 0) 1; });
  

Ответ №1:

Поиграйте с этим:

   var elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e"];
  var map = Map();

  elements.forEach((element) {
    if(!map.containsKey(element)) {
      map[element] = 1;
    } else {
      map[element]  = 1;
    }
  });

  print(map);
  

Что это делает, так это:

  • перебирает элементы списка
  • если для вашей карты в качестве ключа не задан элемент списка, создайте этот элемент со значением 1
  • иначе, если элемент уже существует, он добавляет 1 к существующему значению ключа

Или, если вам нравится синтаксический сахар и однострочники, попробуйте это:

   var elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e"];
  var map = Map();

  elements.forEach((x) => map[x] = !map.containsKey(x) ? (1) : (map[x]   1));

  print(map);
  

Есть много способов добиться этого на всех языках программирования!

Комментарии:

1. Спасибо за вашу помощь! Я хотел бы знать, можно ли было использовать dart => notation, как в моем примере JS.

2. Да, вы можете, я обновил ответ еще одним примером, который использует => и сокращает if / else, используя ? как синтаксический сахар.

3. Я думаю, что больше следует использовать метод «обновления» на картах. Можно было бы написать тот же код, что и этот, который, я думаю, более чистый: elements.forEach((e) => map.update(e, (x) => x 1, ifAbsent: () => 1));

4. Вы также можете использовать: for (var x in elements) map[x] = (map[x] ?? 0) 1; для обновления карты.

5. Lrn: Это тоже хороший чистый пример! 🙂

Ответ №2:

Более короткий способ подсчета количества элементов в списке

Список элементов. Количество элементов равно 1.

 List<int> lst = [0,1,1,1,0,8,8,9,1,0];
int res = lst.map((element) => element == 1 ? 1 : 0).reduce((value, element) => value   element);
  

Список объектов. Подсчитайте объекты, возраст свойства которых равен 1.

 class Person {
   int age;
   
   Person(this.age);
}

List<Person> lst2 = [Person(1), Person(0), Person(1), Person(0)];
int res2 = lst2.map((element) => element.age == 1 ? 1 : 0).reduce((value, element) => value   element);
  

Ответ №3:

Использовать fold с картой:

 final elements = ["a", "b", "c", "d", "e", "a", "b", "c", "f", "g", "h", "h", "h", "e", "a"];

var counts = elements.fold<Map<String, int>>({}, (map, element) {
  map[element] = (map[element] ?? 0)   1;
  return map;
});

print(counts);
  

Выход: {a: 3, b: 2, c: 2, d: 1, e: 2, f: 1, g: 1, h: 3}

Ответ №4:

В конце концов, все сводится к циклу FOR

 void main() {
  final elements = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "a",
    "b",
    "c",
    "f",
    "g",
    "h",
    "h",
    "h",
    "e",
    "a"
  ];

  Map resp = {};
  for (var items in elements) {
    int count = 0;
    for (var val in elements) {
      if (items == val) count  ;
      resp[items] = count;
    }
  }
  print(resp);
}