Flash as3 Comment puis-je supprimer les doublons dans un tableau?
Salut, je viens d'avoir un tableau de noms (chaînes de caractères) en flash, et je veux faire en sorte que tous les doublons à partir de la matrice sont supprimés, ou au moins qu'une fonction est exécutée qu'une seule fois par reocurring valeur dans le tableau.
Vous devez vous connecter pour publier un commentaire.
Plus de chat dépouillement:
De nombreuses façons. Vous pouvez trier le tableau et itérer sur elle en ignorant les entrées qui correspondent à l'itération précédente. Ou vous pouvez utiliser indexOf() pour rechercher les doublons. Ou vous pouvez prendre une passe sur le tableau, construire un dictionnaire à la clé sur les cordes (et d'ignorer les touches qui ont déjà une entrée).
Ici est le Dictionnaire façon, la mémoire, le coût de 1 booléen par entrée unique, facile sur la mémoire pour quand vous vous attendez à beaucoup de dupes, et rapide. Si vous avez relativement peu de dupes, le tri + abattage consécutives de dupes est probablement plus efficace
Voici un tri moyen, mais attention: CELA NE permet PAS de PRÉSERVER l'ORDRE! Vous n'avez pas dit si ce qui compte. Mais parce que c'est à l'aide de quicksort, il a tendance à avoir O(N log N) performance, en plus de la dispense de passer, à moins bien sûr de vos données est un cas pathologique.
En plus de ne pas préciser si l'ordre des questions, vous n'avez pas de dire si c'est des questions qui des dupes est à gauche: l'un à l'indice le plus bas, ou le dernier a trouvé. Si ce qui compte, vous aurez besoin de re-commander mon dictionnaire exemple à courir dans la direction opposée. J'ai commencé à la fin parce que de fait, il est OK pour faire une épissure sans invalider le nombre de boucles (c'est à dire en modifiant la matrice.longueur au cours de la boucle) Si l'ordre des questions, boucle habituelles dans le sens de la marche et de la copie de la première occurrence de chaque chaîne d'un nouveau tableau, ou de modifier le compteur de la boucle comme ceci. C'est probablement la technique que j'utilise, car elle préserve la commande et conserve la première rencontrées instance de chaque chaîne:
Bonnes réponses!
J'ai vérifié quelques-uns d'entre eux, et ils ont de moins bons résultats, contrairement à la mienne.
Exemple:
Statistiques avec mes données:
Dict approche: 8946ms, 8718ms, 8936ms
Obj approche: 8800ms, 8809ms, 8769ms
Mon ancienne approche: 8723ms, 8599ms, 8700ms
Cette approche: 6771ms, 6867ms, 6706ms
Mise à jour 02 /JUL /2019
Intéressant de noter que, pour de meilleures performances, pour créer l'objet, et de définir chaque poussée de valeur de la clé de O(1) de la complexité de la récupération, de sorte que les résultats seront un peu mieux.
Mais le Flash est mort, et probablement ActionScript, donc c'était un enterrement de discours 🙁
C'est une façon de le faire, je suis sûr qu'il en existe d'autres.
Voici une autre façon de faire, peut-être un peu plus agréable à regarder:
Ce n'est probablement pas le plus performant manière de faire, @prototype de la méthode est sans doute beaucoup plus efficace, mais c'est la théorie que vous avez demandé 🙂
J'ai voté pour Adam option, mais ensuite, j'ai trouvé cela, et il me semble que cela pourrait être une meilleure performance sage encore?
L'idée ici est que vous boucle vers l'arrière à travers la matrice, et depuis indexOf vous donne la première survenue d'index, vous pouvez vérifier la trouvé de l'indice à l'indice actuel(i) et supprimer si non le même.
Ici est une façon plus élégante de la suppression des doublons:
Même approche pour un tableau:
aurait @prototype de la réponse donne pas de questions si les sourceArray[i] correspond à sourceArray[j] plus d'une fois, car la longueur de sourceArray serait plus courte si un élément a été .splice()d hors de lui?
J'ai réécrit cette méthode pour compter de la fin pour que cela n'arrive pas