Suchen Sie den Wert in einem Array


124

Wie kann ich in Ruby einen Wert in einem Array finden?


Entschuldigung für diese Art von Frage, ich bin Neuling hier und lerne, dieses Tool zu verwenden. Ich werde versuchen, die Antworten zu finden, bevor ich hier poste.
Lucas Renan

107
An alle, die sich über diese Art von Frage beschweren: Bitte lesen Sie die FAQ: "Keine Frage ist zu trivial oder zu" Neuling "." Wenn Ihnen die Frage nicht gefällt, beantworten Sie sie nicht und lassen Sie dies von jemand anderem tun. Wenn die Frage bereits auf SO gestellt und beantwortet wurde, markieren Sie sie sicher als Duplikat. Aber es gibt keinen Grund, die Neuankömmlinge dafür zu beschimpfen, dass sie neu sind.
Brian Campbell

Antworten:


117

Ich vermute, Sie versuchen herauszufinden, ob ein bestimmter Wert im Array vorhanden ist, und wenn dies der Fall ist, können Sie Array # include? (Wert) verwenden:

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

Wenn Sie etwas anderes meinen, überprüfen Sie die Ruby Array-API


1
Ich würde den Array # -Index verwenden, aber das Überprüfen der Ruby Array-API ist ein guter Tipp.
Wylliam Judd

82

Wenn Array#selectSie verwenden, erhalten Sie eine Reihe von Elementen, die die Kriterien erfüllen. Wenn Sie jedoch nach einer Möglichkeit suchen, das Element aus dem Array herauszuholen, das Ihren Kriterien entspricht, ist Enumerable#detectdies ein besserer Weg:

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

Andernfalls müssten Sie etwas Unangenehmes tun wie:

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

Vielen Dank! Ich wusste davon, Enumerable#selectaber es #detectist genau das, wonach ich gesucht habe.
Justin Adkins

1
array.select{}Durchläuft alle Elemente im Array und sucht nach Elementen, die der Bedingung entsprechen. array.findStattdessen wird das erste Element zurückgegeben, das der Bedingung entspricht. So bevorzugt Verwendung array.find{ |e| e == 3 }dannarray.select{ |e| e == 3 }.first
Oscar Gonzalez

Ich denke, Sie meinten, .find_index ich weiß nicht, ob es welche gibt.find
Ross Attrill

25

Wenn Sie einen Wert aus dem Array suchen möchten, verwenden Sie Array#find:

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

Siehe auch:

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

Um festzustellen, ob ein Wert in einem Array vorhanden ist, können Sie auch #in?ActiveSupport verwenden. #in?funktioniert für jedes Objekt, das reagiert auf #include?:

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

Ich kann keine Array#findin den Ruby-Referenzen sehen. Muss eine Rails-Sache sein, da andere Leute es erwähnt haben. Hmmm ....
Ross Attrill

1
@ Ross Attrill Nein, es ist in Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
Fangxing

Ich habe fälschlicherweise angenommen, dass Ruby-Doc eingeschlossene und geerbte Methoden anzeigt. Wichtige Lektion für mich.
Ross Attrill

23

So was?

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

oder so?

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

Siehe das Handbuch .



16

Verwenden:

myarray.index "valuetoFind"

Dadurch erhalten Sie den Index des gewünschten Elements oder null, wenn Ihr Array den Wert nicht enthält.


9

Diese Antwort richtet sich an alle, die erkennen, dass die akzeptierte Antwort die aktuell geschriebene Frage nicht beantwortet.

Die Frage stellt , wie man findet Wert in einem Array. Die akzeptierte Antwort zeigt , wie Sie überprüfen , ob ein Wert existiert in einem Array.

Es gibt bereits ein Beispiel mit index, daher gebe ich ein Beispiel mit der selectMethode.

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 Bitte zitieren Sie den Teil meiner Antwort, von dem Sie behaupten, dass er eine falsche Aussage ist, und ich werde ihn gerne aktualisieren. Ich gehe davon aus, dass wir hier Englisch verwenden (keine erfundenen Definitionen für Wörter). Und wenn Tausende von Menschen in Google nach "Ruby FIND value in array" suchen, sehen sie diese Frage als erstes Ergebnis. Ich bin sicher, dass sie alle gerne die richtige Antwort erhalten würden.
Mike S

1
@MarkThomas Wenn Sie korrekt waren, sollte diese Frage geschlossen werden, da sie ein Duplikat von stackoverflow.com/questions/1986386/… ist. Es gibt jedoch einen funktionalen Unterschied zwischen "Finden" und "Überprüfen auf Existenz" in einem Array.
Mike S

Ich bin allergisch gegen Leute, die alte Fragen wieder aufleben lassen und wenig bis gar keine Substanz mehr liefern. Das passiert sehr oft. In Ihrem Fall haben Sie, obwohl dies selectbereits 2009 als Antwort bereitgestellt wurde, ein Beispiel-Snippet bereitgestellt, das etwas besser ist. Nachdem ich es überdacht habe, ziehe ich das zurück, was ich zuvor gesagt habe.
Mark Thomas

8

Ich weiß, dass diese Frage bereits beantwortet wurde, aber ich bin hierher gekommen, um nach einer Möglichkeit zu suchen, Elemente in einem Array anhand einiger Kriterien zu filtern. Hier ist mein Lösungsbeispiel: Mit selectfinde ich alle Konstanten in der Klasse, die mit "RUBY_" beginnen.

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

UPDATE: In der Zwischenzeit habe ich festgestellt, dass Array # grep viel besser funktioniert. Für das obige Beispiel

Class.constants.grep /^RUBY_/

hat den Trick gemacht.


1
In der Zwischenzeit habe ich festgestellt, dass Array # grep viel besser funktioniert. Auch für das obige Beispiel Class.constants.grep /^RUBY_/hat der Trick getan.
Mydoghaswürmer

1

Danke für die Antworten.

Mir hat das gefallen:

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

1

Sie können Array-Methoden wählen.

Um alle Array-Methoden anzuzeigen, verwenden Sie die methodsFunktion mit Array. Beispielsweise,

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

Übrigens können Sie verschiedene Methoden zum Überprüfen des Werts im Array verwenden a.include?("name").

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.