Encontre valor em uma matriz

124

Em Ruby, como posso encontrar um valor em uma matriz?

Lucas Renan
fonte
Desculpe por esse tipo de pergunta, sou novato aqui e estou aprendendo a usar essa ferramenta. Tentarei encontrar as respostas antes de postar aqui.
Lucas Renan
107
Para todos que se queixam deste tipo de pergunta: leia o FAQ: 'Nenhuma pergunta é trivial demais ou "novata" demais. Se você não gostar da pergunta, não responda e deixe que outra pessoa o faça. Se a pergunta já foi feita e respondida no SO, certifique-se de marcar como duplicada. Mas não há razão para repreender os recém-chegados por serem novos.
31909 Brian Campbell

Respostas:

117

Eu estou supondo que você está tentando descobrir se um determinado valor existe dentro da matriz e, se for esse o caso, você pode usar a Matriz # include? (Value):

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

Se você quer dizer algo mais, verifique a API Ruby Array

Mark Westling
fonte
1
Eu usaria o índice Array #, mas verificar a API Ruby Array é uma ótima dica.
Wylliam Judd 15/10
82

O uso Array#selectfornecerá uma variedade de elementos que atendem aos critérios. Mas se você estiver procurando uma maneira de obter o elemento da matriz que atenda aos seus critérios, Enumerable#detectseria o melhor caminho a seguir:

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

Caso contrário, você teria que fazer algo estranho, como:

found = array.select {|e| e == 3}.first
Will Warner
fonte
Obrigado! Eu sabia, Enumerable#selectmas #detecté exatamente o que estava procurando.
Justin Adkins
1
array.select{}percorrerá todos os elementos da matriz procurando aqueles que correspondem à condição. array.findem vez disso, retornará o primeiro elemento que corresponde à condição. Então uso preferível array.find{ |e| e == 3 }entãoarray.select{ |e| e == 3 }.first
Oscar Gonzalez
Eu acho que você quis dizer que .find_index eu não sei se existe.find
Ross Attrill
26

Se você deseja encontrar um valor da matriz, use Array#find:

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

Veja também:

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

Para descobrir se existe um valor em uma matriz, você também pode usar #in?ao usar o ActiveSupport. #in?funciona para qualquer objeto que responda a #include?:

arr = [1, 6]
6.in? arr                 #=> true
fangxing
fonte
Não consigo ver nenhuma Array#findnas referências Ruby. Deve ser uma coisa do Rails, já que outras pessoas o mencionaram. Hummm ....
Ross Attrill
1
@Ross Attrill Não, está dentro Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing
Eu assumi incorretamente que o ruby-doc mostra métodos incluídos e herdados. Lição importante para mim.
Ross Attrill
23

Como isso?

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 assim?

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

Veja o manual .

Ewan Todd
fonte
16

Usar:

myarray.index "valuetoFind"

Isso retornará o índice do elemento desejado ou nulo se sua matriz não contiver o valor.

Wim Hollebrandse
fonte
9

Esta resposta é para todos que percebem que a resposta aceita não aborda a pergunta como está atualmente escrita.

A pergunta pergunta como encontrar um valor em uma matriz. A resposta aceita mostra como verificar se existe um valor em uma matriz.

Já existe um exemplo usando index, por isso estou fornecendo um exemplo usando o 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
fonte
@ MarkThomas, por favor, cite a parte da minha resposta que você está afirmando ser uma declaração incorreta e eu a atualizarei com prazer. Estou assumindo que estamos usando o inglês aqui (não criamos definições para palavras). E quando milhares de pessoas pesquisam "ruby FIND value in array" no Google, elas veem essa pergunta como o primeiro resultado, por isso tenho certeza de que todas elas gostariam de obter a resposta correta.
Mike S
1
Além disso, @MarkThomas, se você estiver correto, essa pergunta deve ser encerrada por ser duplicada de stackoverflow.com/questions/1986386/… , mas há uma diferença funcional entre "encontrar" e "verificar a existência" em uma matriz.
Mike S
Sou alérgico a pessoas que ressuscitam perguntas antigas e fornecem pouca ou nenhuma substância. Isso acontece muito. No seu caso, embora selectjá tenha sido fornecida como resposta em 2009, você forneceu um snippet de amostra que é um pouco melhor. Então, depois de repensá-lo, retiro o que disse anteriormente.
9788 Mark
8

Sei que essa pergunta já foi respondida, mas vim aqui procurando uma maneira de filtrar elementos em uma matriz com base em alguns critérios. Então, aqui está o meu exemplo de solução: using select, encontro todas as constantes na classe que começam com "RUBY_"

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

ATUALIZAÇÃO: Enquanto isso, descobri que o Array # grep funciona muito melhor. Para o exemplo acima,

Class.constants.grep /^RUBY_/

fez o truque.

mydoghasworms
fonte
1
Enquanto isso, descobri que o Array # grep funciona muito melhor. Mesmo para o exemplo acima, Class.constants.grep /^RUBY_/fiz o truque.
mydoghasworms
1

Obrigado pelas respostas.

Eu fiz assim:

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

Você pode optar por métodos de matriz.

Para ver todos os métodos de matriz, use a methodsfunção com matriz. Por exemplo,

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

A propósito, você pode usar um método diferente para verificar o valor na matriz. Você pode usar a.include?("name").

Foram Thakral
fonte