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