Trouver une valeur dans un tableau


124

Dans Ruby, comment puis-je trouver une valeur dans un tableau?


Désolé pour ce type de question, je suis novice ici, et j'apprends à utiliser cet outil, je vais essayer de trouver les réponses avant de poster ici.
Lucas Renan

107
A tous ceux qui se plaignent de ce genre de question: veuillez lire la FAQ: 'Aucune question n'est trop triviale ou trop "newbie" ". Si vous n'aimez pas la question, n'y répondez pas et laissez quelqu'un d'autre le faire. Si la question a déjà été posée et répondue sur SO, alors bien sûr, marquez-la comme un double. Mais il n'y a aucune raison de réprimander les nouveaux venus parce qu'ils sont nouveaux.
Brian Campbell

Réponses:


117

J'imagine que vous essayez de trouver si une certaine valeur existe dans le tableau, et si c'est le cas, vous pouvez utiliser Array # include? (Valeur):

a = [1,2,3,4,5]
a.include?(3)   # => true
a.include?(9)   # => false

Si vous voulez dire autre chose, vérifiez l' API Ruby Array


1
J'utiliserais l'index Array #, mais vérifier l'API Ruby Array est un excellent conseil.
Wylliam Judd

82

L'utilisation Array#selectvous donnera un tableau d'éléments qui répondent aux critères. Mais si vous cherchez un moyen d'extraire l'élément du tableau qui répond à vos critères, ce Enumerable#detectserait une meilleure façon de procéder:

array = [1,2,3]
found = array.select {|e| e == 3} #=> [3]
found = array.detect {|e| e == 3} #=> 3

Sinon, vous devrez faire quelque chose de maladroit comme:

found = array.select {|e| e == 3}.first

Merci! Je savais Enumerable#selectmais #detectc'est exactement ce que je cherchais.
Justin Adkins

1
array.select{}parcourra tous les éléments du tableau en recherchant ceux qui correspondent à la condition. array.findà la place retournera le premier élément qui correspond à la condition. Utilisation si préférable array.find{ |e| e == 3 }alorsarray.select{ |e| e == 3 }.first
Oscar Gonzalez

Je pense que vous vouliez dire que .find_index je ne sais pas s'il y en a.find
Ross Attrill

27

Si vous voulez trouver une valeur à partir du tableau, utilisez Array#find:

arr = [1,2,6,4,9] 
arr.find {|e| e%3 == 0}   #=>  6

Voir également:

arr.select {|e| e%3 == 0} #=> [ 6, 9 ]
e.include? 6              #=> true

Pour savoir si une valeur existe dans un tableau, vous pouvez également l'utiliser #in?lors de l'utilisation d'ActiveSupport. #in?fonctionne pour tout objet qui répond à #include?:

arr = [1, 6]
6.in? arr                 #=> true

Je n'en vois aucun Array#finddans les références Ruby. Ça doit être un truc Rails puisque d'autres personnes l'ont mentionné. Hmmm ....
Ross Attrill


J'ai supposé à tort que ruby-doc montre des méthodes incluses et héritées. Leçon importante pour moi.
Ross Attrill

23

Comme ça?

a = [ "a", "b", "c", "d", "e" ]
a[2] +  a[0] + a[1]    #=> "cab"
a[6]                   #=> nil
a[1, 2]                #=> [ "b", "c" ]
a[1..3]                #=> [ "b", "c", "d" ]
a[4..7]                #=> [ "e" ]
a[6..10]               #=> nil
a[-3, 3]               #=> [ "c", "d", "e" ]
# special cases
a[5]                   #=> nil
a[5, 1]                #=> []
a[5..10]               #=> []

ou comme ça?

a = [ "a", "b", "c" ]
a.index("b")   #=> 1
a.index("z")   #=> nil

Consultez le manuel .



16

Utilisation:

myarray.index "valuetoFind"

Cela vous renverra l'index de l'élément souhaité ou nul si votre tableau ne contient pas la valeur.


9

Cette réponse est pour tous ceux qui réalisent que la réponse acceptée ne répond pas à la question telle qu'elle est actuellement écrite.

La question demande comment trouver une valeur dans un tableau. La réponse acceptée montre comment vérifier si une valeur existe dans un tableau.

Il existe déjà un exemple utilisant index, donc je donne un exemple utilisant la selectméthode.

1.9.3-p327 :012 > x = [1,2,3,4,5]
  => [1, 2, 3, 4, 5] 
1.9.3-p327 :013 > x.select {|y| y == 1}
  => [1]

@MarkThomas veuillez citer la partie de ma réponse que vous prétendez être une déclaration incorrecte et je la mettrai à jour avec plaisir. Je suppose que nous utilisons l'anglais ici (pas de définitions inventées pour les mots). Et lorsque des milliers de personnes recherchent "ruby FIND value in array" dans Google, elles voient cette question comme le premier résultat, donc je suis sûr qu'ils aimeraient tous obtenir la bonne réponse.
Mike S

1
De plus, @MarkThomas si vous aviez raison, cette question devrait être fermée car elle est une duplication de stackoverflow.com/questions/1986386/... , mais il existe une différence fonctionnelle entre "trouver" et "vérifier l'existence" dans un tableau.
Mike S

Je suis allergique aux gens qui ressuscitent de vieilles questions et fournissent peu ou pas de substance. Cela arrive souvent. Dans votre cas, bien que cela selectait déjà été fourni comme réponse en 2009, vous avez fourni un extrait de code qui est un peu meilleur. Alors après y avoir repensé, je rétracte ce que j'ai dit plus tôt.
Mark Thomas

8

Je sais que cette question a déjà reçu une réponse, mais je suis venu ici à la recherche d'un moyen de filtrer les éléments d'un tableau en fonction de certains critères. Voici donc mon exemple de solution: en utilisant select, je trouve toutes les constantes de Class qui commencent par "RUBY_"

Class.constants.select {|c| c.to_s =~ /^RUBY_/ }

MISE À JOUR: En attendant, j'ai découvert que Array # grep fonctionne beaucoup mieux. Pour l'exemple ci-dessus,

Class.constants.grep /^RUBY_/

a fait l'affaire.


1
En attendant, j'ai découvert que Array # grep fonctionne beaucoup mieux. Même pour l'exemple ci-dessus, a Class.constants.grep /^RUBY_/fait l'affaire.
mydoghasworms

1

Merci pour les réponses.

J'ai aimé ceci:

puts 'find' if array.include?(value)

1

Vous pouvez opter pour des méthodes de tableau.

Pour voir toutes les méthodes de tableau, utilisez la methodsfonction avec tableau. Par exemple,

a = ["name", "surname"] 
a.methods

Par ailleurs, vous pouvez utiliser une méthode différente pour vérifier la valeur dans le tableau que vous pouvez utiliser a.include?("name").

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.