J'essaie de fusionner 2 listes pour que le résultat soit le suivant:
List<String> array1 = ["John", "Bob", "Fred", "June", "Tom"]; List<String> array2 = ["House", "Flat", "Bungalow"]; List<String> output = //["John", "House", "Bob", "Flat", "Fred", "Bungalow", "June", "Tom"]
Comment puis-je y parvenir? J'ai jeté un coup d'œil à la fonction zip dans la bibliothèque quiver mais il ne renvoie qu'une liste aussi longue que la liste la plus courte qui y est passée.
EDIT : Pour clarifier, je veux essentiellement faire la même chose que la fonction zip, mais si une tableau est plus long que l'autre, je veux juste ajouter les éléments restants à la fin.
6 Réponses :
Je ne connais rien de prêt à l'emploi, mais cela devrait faire ce que vous voulez:
import 'dart:math' as math;
void main() {
List<String> array1 = ["John", "Bob", "Fred", "June", "Tom"];
List<String> array2 = ["House", "Flat", "Bungalow"];
List<String> output = List<String>(array1.length + array2.length);
int i = 0;
for (i; i < math.min(array1.length, array2.length); i++) {
output[i * 2] = array1[i];
output[i * 2 + 1] = array2[i];
}
print(output);
if (array1.length != array2.length) {
if (array1.length > array2.length) {
output.setRange(i * 2, output.length, array1.sublist(i));
} else {
output.setRange(i * 2, output.length, array2.sublist(i));
}
}
print(output);
}
Merci pour votre réponse, mais cela ne va-t-il pas simplement ajouter un tableau à l'autre? J'ai mis à jour la question pour ajouter, espérons-le, plus de détails.
La commande est donc pertinente? Je pensais que vous ne vouliez tout simplement pas de doublons.
Une autre solution est la suivante qui est probablement moins efficace que la solution de Gunter mais est un peu plus fonctionnelle par nature et j'aime avoir plusieurs perspectives sur la façon de résoudre un problème. Si les tableaux sont aussi courts que ceux-ci, l'optimisation de la jointure n'est probablement pas un problème de toute façon.
Cette solution crée un itérable sur les indices du tableau le plus long et pour chaque index i, crée potentiellement deux entrées à partir des tableaux d'entrée si je suis dans les deux. Sinon, il inclut uniquement l'élément du tableau qui contient i.
import 'dart:math' as math;
main() {
List<String> array1 = ["John", "Bob", "Fred", "June", "Tom"];
List<String> array2 = ["House", "Flat", "Bungalow"];
//["John", "House", "Bob", "Flat", "Fred", "Bungalow", "June", "Tom"]
List<String> output =
Iterable.generate(math.max(array1.length, array2.length))
.expand((i) sync* {
if (i < array1.length) yield array1[i];
if (i < array2.length) yield array2[i];
}).toList();
print(output);
}
Je doute qu'il existe une méthode de base qui fasse exactement ce que vous voulez. Jetez un œil à ma fonction merge :
import 'dart:math';
List<String> merge(List<String> a, List<String> b) {
List<String> output = [];
var min_length = min(a.length, b.length);
var max_length = max(a.length, b.length);
for(var i = 0; i < min_length; i++) {
output.add(a[i]);
output.add(b[i]);
}
List<String> longer = a.length > b.length ? a : b;
for(var i = min_length; i < max_length; i++) {
output.add(longer[i]);
}
return output;
}
void main() {
merge(
["John", "Bob", "Fred", "June", "Tom"],
["House", "Flat", "Bungalow"]
).forEach((e) => print(e));
print('------');
merge(
["John", "Bob"],
["House", "Flat", "Bungalow"]
).forEach((e) => print(e));
}
Je pense que cela devrait fonctionner aussi
[John, Bob, Fred, June, Tom] [House, Flat, Bungalow] [John, Bob, Fred, June, Tom, House, Flat, Bungalow]
les sorties devraient être comme ça (testé dans DartPad )
void main() {
var list1 = ["John", "Bob", "Fred", "June", "Tom"];
var list2 = ["House", "Flat", "Bungalow"];
var list3 = [...list1, ...list2];
print(list1);
print(list2);
print(list3);
}
Cela ajoute simplement une liste à l'autre, ce n'est pas ce que le questionneur demande. Ils veulent fusionner les deux.
Désolé? Je crée une nouvelle liste et fusionne les 2 autres à l'aide de l'opérateur de propagation, pourquoi cela n'a-t-il pas été compté comme fusion? également. Je ferais mieux d'utiliser list.addAll (anotherList) pour ajouter une liste.
ah, mon mal. ma réponse était, en effet n'a pas répondu à la question, désolé.
Pas de problème, c'est génial que vous vous soyez impliqué et que vous ayez suggéré une réponse. Je vous suggère de réécrire ou de supprimer votre réponse pour éviter les votes négatifs.
Vous pouvez utiliser la méthode addAll () comme dans.
List<int> a =[1,2]; List<int> b =[1,2]; a.insertAll(a.length,b);
Ou insertAll (index, Iterateable ) p >
List<int> a =[1,2]; List<int> b =[1,2]; List<int> c =[]; c.addAll(a); c.addAll(b);
Je n'ai pas trouvé de solution à cela non plus, et je ne voulais pas utiliser les conversions de liste ou les fonctions mathématiques si possible, alors j'ai écrit ceci:
extension IterableExtensions<T> on Iterable<T> {
Iterable<T> merge(Iterable<T> other) sync* {
Iterator<T> iter1 = this.iterator;
Iterator<T> iter2 = other.iterator;
bool has1 = iter1.moveNext();
bool has2 = iter2.moveNext();
while(has1 && has2) {
yield iter1.current;
yield iter2.current;
has1 = iter1.moveNext();
has2 = iter2.moveNext();
}
while(has1) {
yield iter1.current;
has1 = iter1.moveNext();
}
while(has2) {
yield iter2.current;
has2 = iter2.moveNext();
}
}
}
Cela pourrait probablement être un peu rangé mais ça marche pour le moment.
Exemples ici . p>