112 votes

Comment convertir une liste en une map en Dart

Je cherche un moyen prêt-à-l'emploi pour convertir une liste en carte en Dart.

En python par exemple, vous pouvez faire :

l= [ ('a',(1,2)), ('b',(2,3)), ('c',(3,4) ) ]
d=dict(l)
==> {'a': (1, 2), 'c': (3, 4), 'b': (2, 3)}

La fonction dict attend une liste de couples. Pour chaque couple, le premier élément est utilisé comme clé et le second comme donnée.

En Dart, j'ai vu la méthode suivante pour une liste : asMap(), mais elle ne fait pas ce que j'attends : elle utilise l'index de la liste comme clé. Mes questions :

  • Savez-vous quelque chose dans les bibliothèques Dart pour faire cela ?
  • Si non, avez-vous prévu d'ajouter une telle fonctionnalité dans la librairie de base ?

Proposition :

List.toMap() //même que le dict python.
List.toMap( (value) => [ value[0], value[1] ] ) //Utilisation d'une fonction anonyme pour retourner une clé et une valeur à partir d'un élément de liste.

Merci et cordialement,

Nicolas

185voto

Alexandre Ardhuin Points 16297

Vous pouvez utiliser Map.fromIterable :

var result = Map.fromIterable(l, key: (v) => v[0], value: (v) => v[1]);

ou collection-for (à partir de Dart 2.3) :

var result = { for (var v in l) v[0]: v[1] };

70voto

simonpai Points 726

Dans Dart 1.1, vous pouvez utiliser ce constructeur de Map :

new Map.fromIterable(list, key: (v) => v[0], value: (v) => v[1]);

Cela se rapprocherait le plus de votre proposition initiale.

64voto

Kabirou Agouda Points 1621

Pour Dart 2.3 et plus ,

Il existe de nombreuses solutions, mais les plus simples sont :

1- Utilisez la fonction asMap()

List list = ['steve', 'bill', 'musk'];
Map map = list.asMap();
print(map);

Sortie :

{0: steve, 1: bill, 2: musk}

2- Utilisez la collection for-in à l'intérieur de votre map Map map = {};

List list = ['steve', 'bill', 'musk'];
Map map = {for (var item in list) '$item' : 'valueOf$item'};
print(map);

Sortie :

{steve: valueOfsteve, bill: valueOfbill, musk: valueOfmusk}

J'espère que cela vous sera utile.

25voto

Delgan Points 4395

Une autre possibilité est d'utiliser le Map.fromEntries() constructeur :

final result = Map.fromEntries(l.map((value) => MapEntry(value[0], value[1])));

4voto

Vasily Bodnarchuk Points 8047

Détails

  • Flutter 1.26.0-18.0.pre.106

Solution

/libs/extensions/list.dart

extension MapFromList on List {
  Map toMap(
          MapEntry Function(Element e) getEntry) =>
      Map.fromEntries(map(getEntry));

  Map toMapWhereKey(Key Function(Element e) getKey) =>
      Map.fromEntries(map((e) => MapEntry(getKey(e), e)));
}

Utilisation

import 'package:myApp/libs/extensions/list.dart';

final list = [1,2,3,4];
print(list.toMap((e) => MapEntry(e-1, e)));  // {0: 1, 1: 2, 2: 3, 3: 4}
print(list.toMapWhereKey((e) => "str $e"));  // {str 1: 1, str 2: 2, str 3: 3, str 4: 4}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X