0
votes

Comment puis-je lier des listes?

Connaissez-vous un moyen d'insérer des objets d'une autre liste dans une liste? Ainsi:

List<FoodItem> top10 = [
    pizza[1],
    burger[0],
    snacks[3],
  ];

Cela semble probablement déroutant maintenant, mais je voudrais vous expliquer brièvement pourquoi j'en ai besoin. Comme vous pouvez le voir, j'ai différentes listes d'aliments. Je voudrais maintenant créer une liste Top10 qui montre les 10 meilleurs plats de tous les plats. Ainsi, chaque FoodItem de top10 est également membre d'autres listes. Par exemple, si le meilleur plat est une pizza au prosciutto, alors le plat est au numéro 1 sur la liste Top10, mais aussi sur la liste des pizzas.

Désormais, une variable du FoodItem est modifiée de temps en temps lors de l'utilisation de l'application. Je veux que les modifications apportées à la variable soient visibles dans les autres listes.

Comprenez vous?


2 commentaires

Votre liste est déjà définie pour contenir des références aux objets FoodItem (la liste ne contient donc pas réellement les objets elle-même). Ainsi, si le même objet est référencé dans deux listes, les mises à jour d'une liste seront automatiquement également vues dans l'autre liste.


Oui, c'est le cas car ces objets FoodItem sont attribués par référence. Comprenez-vous l'attribution par référence et l'attribution par valeur?


3 Réponses :


0
votes

Tu es presque là.

Vous pouvez définir top10 comme 'FoodItems' à condition que les classes Pizza, Burger et Snack en héritent. Dans le cas où ce n'est pas possible pour une raison quelconque, vous pouvez définir top10 comme Liste. La fenêtre de débogage à gauche dans la capture d'écran ci-dessous montre que «universalList» contient deux listes - les pizzas et les pâtes.

entrez la description de l'image ici


2 commentaires

Je ne peux donc intégrer que des listes complètes dans top10, non?


Soit une liste complète d'un filtre filtré, selon vos besoins. Par exemple, universalList.add(pastas.where((pasta) => pasta.price <= 10); Je viens de vous donner un exemple de code pour montrer comment cela fonctionne. :)



0
votes

Vous pouvez insérer un objet d'une liste dans une autre avec:

top10.add(2, pizzas.get(0));

Dans cet exemple de code, vous insérez le premier élément de la liste des pizzas à la position 2 de la liste des 10 premiers. Il est important de savoir que lorsque vous insérez un objet à partir d'une liste, vous insérez la référence à l'objet, sans faire une copie de cet objet, donc l'objet est le même. Si vous modifiez une propriété dans l'objet de la pizza, vous verrez également les modifications dans l'objet de top10 (ce sont tous les deux le même objet).


2 commentaires

Oh, c'est vraiment super! Je cherchais une solution aussi simple! Cela va-t-il aussi dans l'autre sens? Donc si je change quelque chose dans top10. Le changement sera-t-il également affiché dans la pizza?


Oui, si vous modifiez un objet de top10, vous verrez le changement dans la pizza, car c'est le même objet.



0
votes

Je pense qu'il y a un champ de score dans FoodItem pour juger s'il est meilleur qu'un autre. Si tel est le cas, vous pouvez ajouter une fonction de comparaison:

List<FoodItem> get allFoods => [
      ...pizaa,
      ...burger,
      ...snacks,
    ];

List<FoodItem> get top10 {
  var list = allFoods.toList();
  list.sort(compareFood);
  return list.sublist(0, list.length >= 10 ? 10 : list.length);
}

Ensuite, vous pouvez obtenir une liste d'aliments triés:

List<FoodItem> get sortedSnacks {
  var list = snacks.toList();
  list.sort(compareFood);
  return list;
}

Pour top10:

int compareFood(FoodItem food1, FoodItem food2) => food1.score > food2.score ? -1 : 1;


1 commentaires

C'est vraiment intelligent! Merci pour votre réponse rapide et détaillée! Je ne peux donc filtrer que les plats que je souhaite transférer dans la base de données! Merci mon ami: D