Encuentra valor en una matriz

124

En Ruby, ¿cómo puedo encontrar un valor en una matriz?

Lucas Renan
fuente
Perdón por este tipo de pregunta, soy novato aquí y estoy aprendiendo a usar esta herramienta. Intentaré encontrar las respuestas antes de publicar aquí.
Lucas Renan el
107
Para todos los que se quejan de este tipo de preguntas: lea las preguntas frecuentes: "Ninguna pregunta es demasiado trivial o demasiado" novata "". Si no le gusta la pregunta, no la responda y deje que alguien más lo haga. Si la pregunta ya ha sido formulada y respondida en SO, entonces seguro, márquela como un duplicado. Pero no hay razón para regañar a los recién llegados por ser nuevos.
Brian Campbell

Respuestas:

117

Supongo que está tratando de encontrar si existe un cierto valor dentro de la matriz, y si ese es el caso, puede usar Array # include? (Value):

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

Si quiere decir algo más, consulte la API de Ruby Array

Mark Westling
fuente
1
Usaría el índice Array #, pero verificar la API de Ruby Array es un gran consejo.
Wylliam Judd
82

El uso Array#selectle dará una variedad de elementos que cumplen con los criterios. Pero si está buscando una forma de sacar el elemento de la matriz que cumpla con sus criterios, Enumerable#detectsería una mejor manera de hacerlo:

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

De lo contrario, tendría que hacer algo incómodo como:

found = array.select {|e| e == 3}.first
Will Warner
fuente
¡Gracias! Lo sabía, Enumerable#selectpero #detectes exactamente lo que estaba buscando.
Justin Adkins
1
array.select{}pasará por todos los elementos de la matriz buscando aquellos que coincidan con la condición. array.finden su lugar, devolverá el primer elemento que coincida con la condición. Entonces uso preferible array.find{ |e| e == 3 }entoncesarray.select{ |e| e == 3 }.first
Oscar Gonzalez
Creo que quisiste decir .find_index que no sé si hay alguno.find
Ross Attrill
26

Si desea encontrar un valor de la matriz, use Array#find:

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

Ver también:

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

Para saber si existe un valor en una matriz, también puede usarlo #in?cuando use ActiveSupport. #in?funciona para cualquier objeto que responda a #include?:

arr = [1, 6]
6.in? arr                 #=> true
fangxing
fuente
No puedo ver ninguno Array#finden las referencias de Ruby. Debe ser una cosa de Rails ya que otras personas lo han mencionado. Hmmm ....
Ross Attrill
1
@Ross Attrill No, está en Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing
Asumí incorrectamente que ruby-doc muestra métodos incluidos y heredados. Lección importante para mi.
Ross Attrill
23

¿Me gusta esto?

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]               #=> []

¿o así?

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

Ver el manual .

Ewan Todd
fuente
16

Utilizar:

myarray.index "valuetoFind"

Eso le devolverá el índice del elemento que desea o nulo si su matriz no contiene el valor.

Wim Hollebrandse
fuente
9

Esta respuesta es para todos los que se dan cuenta de que la respuesta aceptada no aborda la pregunta tal como está escrita actualmente.

La pregunta pregunta cómo encontrar un valor en una matriz. La respuesta aceptada muestra cómo verificar si existe un valor en una matriz.

Ya hay un ejemplo usando index, así que estoy proporcionando un ejemplo usando el selectmétodo.

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]
Mike S
fuente
@ MarkThomas, por favor, cita la parte de mi respuesta que estás afirmando que es una declaración incorrecta y con gusto la actualizaré. Supongo que estamos usando inglés aquí (no hay definiciones inventadas para palabras). Y cuando miles de personas buscan "ruby FIND value in array" en Google, ven esta pregunta como el primer resultado, por lo que estoy seguro de que a todos les encantaría obtener la respuesta correcta.
Mike S
1
Además, @MarkThomas si estaba en lo correcto, entonces esta pregunta debería cerrarse por ser un duplicado de stackoverflow.com/questions/1986386/… , pero hay una diferencia funcional entre "encontrar" y "verificar la existencia" en una matriz.
Mike S
Soy alérgico a la gente que resucita viejas preguntas y proporciona poca o ninguna sustancia. Esto pasa mucho. En su caso, aunque selectya se proporcionó como respuesta en 2009, proporcionó un fragmento de muestra que es un poco mejor. Entonces, después de repensarlo, retracto lo que dije antes.
Mark Thomas
8

Sé que esta pregunta ya ha sido respondida, pero vine aquí buscando una forma de filtrar elementos en una matriz según algunos criterios. Así que aquí está mi ejemplo de solución: usando select, encuentro todas las constantes en la clase que comienzan con "RUBY_"

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

ACTUALIZACIÓN: Mientras tanto, he descubierto que Array # grep funciona mucho mejor. Para el ejemplo anterior,

Class.constants.grep /^RUBY_/

Hizo el truco.

mydoghasworms
fuente
1
Mientras tanto, he descubierto que Array # grep funciona mucho mejor. Incluso para el ejemplo anterior, Class.constants.grep /^RUBY_/hizo el truco.
mydoghasworms
1

Gracias por las respuestas

Me gustó esto:

puts 'find' if array.include?(value)
Lucas Renan
fuente
1

Puedes ir por métodos de matriz.

Para ver todos los métodos de matriz, utilice la methodsfunción con matriz. Por ejemplo,

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

Por cierto, puede usar un método diferente para verificar el valor en la matriz que puede usar a.include?("name").

Foram Thakral
fuente