Comment trouver et retourner une valeur répétée dans le tableau
arr
- Ceci est une gamme de cordes:
["hello", "world", "stack", "overflow", "hello", "again"]
Quel serait un moyen simple et élégant de vérifier s'il y a
arr
duplique, et si oui, revenez l'un d'eux /peu importe ce que/?
Exemples:
["A", "B", "C", "B", "A"] # => "A" or "B"
["A", "B", "C"] # => nil
Aucun résultat connexe trouvé
Invité:
Pour répondre aux questions, connectez-vous ou registre
20 réponses
Clement
Confirmation de:
Je sais que ce n'est pas une réponse très élégante, mais je l'aime. Ceci est un beau code avec une ligne. Et fonctionne bien, sauf si vous avez besoin de gérer un énorme ensemble de données.
Vous cherchez une solution plus rapide? Vous voilà!
Il est linéaire O/n/, Mais maintenant il a besoin de gérer plusieurs lines-of-code, Besoin de cas de test, etc.
Si vous avez besoin de solution encore plus rapide, vous pouvez essayer C au lieu de cela.
Mais l'essence de la comparaison de diverses solutions:
https://gist.github.com/naveed ... 9743e
David
Confirmation de:
Et option O/N^2/ /c'est-à-dire moins efficace/:
Guillaume
Confirmation de:
S'il n'y a pas de duplicates, la valeur de retour sera nulle.
Je crois que c'est la solution la plus rapide publiée dans le flux jusqu'à présent, car elle ne dépend pas de la création d'objets supplémentaires, mais
et
mis en œuvre dans C. Délai de mise en œuvre big-O se réconcilier N^2 Et, par conséquent, plus lent que Sergio, mais le temps du mur peut être beaucoup plus rapide en raison du fait que des pièces "slow" Travailler dans C.
Camille
Confirmation de:
Il n'y a qu'un seul duplicata.
va tous les trouver tous:
David
Confirmation de:
Utiliser l'ensemble
Utilisation
au lieu
, Pour retourner le tableau de tous les doublons.
Utilisation
Jeter
, Pour retourner le tableau de tous les doublons.
Les deux méthodes sont retournées
, S'il n'y a pas de doublons.
je
https://bugs.ruby-lang.org/issues/11815
Être ajouté à K. Ruby noyau. Pour plus d'informations, voir ma réponse.
https://coderoad.ru/24987054/
.
Indicateur
Comparons les méthodes proposées. Tout d'abord, nous avons besoin d'un tableau pour tester:
et la méthode d'exécution des indicateurs de contrôle pour diverses matrices de test:
Je n'ai pas inclus la réponse @JjP's, Parce qu'un seul duplicata devrait être retourné et quand il/Sa réponse sera changée pour le faire, ce sera la même chose que la réponse précédente. @Naveed's. Je n'ai pas non plus l'inclusion de la réponse @Marin's, qui, étant envoyé à la réponse @Naveed's, retourné tous les doublons, et pas seulement un /un léger point, mais cela n'a aucun sens d'évaluer les deux, car ils sont identiques lorsqu'un seul duplicata est renvoyé/.
J'ai également modifié d'autres réponses qui ont renvoyé tous les doublons pour ne renvoyer que le premier trouvé, mais il n'aurait pas dû être considérablement affecté par la performance, car ils ont calculé tous les doublons avant de choisir l'un d'entre eux.
Les résultats pour chaque référence sont énumérés du plus rapide au plus lent:
Principalement supposer que le tableau contient 100 Éléments:
Maintenant considérons un tableau de 10 000 Éléments:
Notez que
Ce serait beaucoup plus efficace si
A été implémenté B. C, Que se passerait-il s'il a été ajouté au noyau Ruby.
Production
Beaucoup de réponses sont raisonnables, mais
L'utilisation d'un ensemble est le meilleur choix évident
. Il fonctionne plus rapidement dans les cas intermédiaires, cela fonctionne plus rapidement dans les cas les plus difficiles et les plus difficiles à caractère informatique - lorsque votre choix n'aura pas d'importance - Il peut être vaincu.
Le seul cas très spécial dans lequel vous pourriez choisir la décision de Chris, c'est si vous souhaitez utiliser cette méthode pour éliminer séparé des doublons de milliers de petites tableaux et s'attendre à trouver un duplicata, en règle générale, moins 10 Éléments. Ce sera un peu plus rapide, car il évitera de petits coûts supplémentaires supplémentaires pour créer un ensemble.
Gaetan
Confirmation de:
.
Voici la solution
,
Quelle est la complexité?
Courir B.
et se casse sur le premier match
Utilise la mémoire
, Mais seulement le volume minimum
Maintenant, en fonction de la fréquence des duplicats dans votre tableau, ces environnements d'exécution peuvent être encore meilleurs. par exemple , Si la taille de la taille
a été choisi parmi l'agrégat
différents éléments, puis la complexité à la fois pour le temps d'exécution et l'espace devient
, Cependant, il est plus probable que l'affiche source vérifie les données d'entrée et veut s'assurer qu'il n'y a pas de doublons. Dans ce cas, le temps d'exécution et la complexité de la mémoire
, Comme nous nous attendons à ce que des articles ne disposent pas de répétitions pour la plupart des données d'entrée.
Gilles
Confirmation de:
.
Le premier formulaire est ce qui vous intéresse ici. Il vous permet de choisir des objets qui passent le test.
Ruby Les objets de la matrice ont une autre méthode,
.
Dans ce cas, vous êtes intéressé par des duplicats /Objets qui apparaissent dans le tableau plus d'une fois/. Test correspondant
.
Si un
a = ["A", "B", "C", "B", "A"]
, cette
Vous déclarez que vous n'avez besoin que de
une
un objet. Alors choisissez-en un.
Eugene
Confirmation de:
Retour
, Contenant tous les éléments
, Pour qui
n'est pas
.
Obtenir
Élément
Ou dupliquer
Élément
Alice
Confirmation de:
C'est-à-dire placer toutes les valeurs dans hash, où la clé est un élément de tableau et la valeur du nombre d'occurrences. Ensuite, sélectionnez tous les éléments rencontrés plus d'une fois. Facilement.
Fabien
Confirmation de:
Ce qui précède renvoie la matrice de toutes les adresses email, qui sont dupliqués dans la table de base de données de cet exemple /qui B. Rails sera "active_record_classes"/.
Dominique
Confirmation de:
Ceci est une procédure
.
Sinon, vous pouvez faire l'une des lignes suivantes. Également O/n/, Mais une seule itération
Emilie
Confirmation de:
Fabrice
Confirmation de:
Francois
Confirmation de:
-Est-ce ton ami!
Florian
Confirmation de:
brisé 2 Array: La première contient des valeurs uniques et les secondes duplicats.
Vous pouvez le couper encore plus - Bien que le prix soit une syntaxe un peu plus complexe - à ce formulaire:
Dominique
Confirmation de:
résultats
Catherine
Confirmation de:
, À condition de
https://ruby-doc.org/core-2.4. ... -i-26
Ruby .
Fabrice
Confirmation de:
Charles
Confirmation de:
Dans le corps de la méthode crée 2 nouveaux objets du tableau, dont l'un est visible et l'autre est dupliqué
Enfin, exécutons chaque objet dans cette matrice et pour chaque itération, nous constaterons que l'objet existait dans un tableau visible.
Si l'objet existait dans seen_array, Ensuite, il est considéré comme un objet en double et placé dans duplication_array
Si l'objet n'existe pas en vue, il est considéré comme un objet unique, puis cliquez sur ce que l'objet dans seen_array
Démontrons-le dans la mise en œuvre du code
Appelez maintenant la méthode de duplication et affichez le résultat renvoyé. -
Guillaume
Confirmation de:
[1,2,3].uniq!.nil? => true
[1,2,3,3].uniq!.nil? => false
Veuillez noter que ce qui précède est destructeur