2012-03-25 9 views
1

Ich habe eine 2 Arrays von 2 verschiedenen Standorten, aber sie enthalten die gleichen Elemente. Im Folgenden zeigt, was ich habe:Vergleichen Sie 2 Array-Inhalte in Ruby

@var2 = ["2/05/2008", "$1.5000", "$2.0000"] 
     ["1/06/2007", "$1.4000", "$1.0000"] 

@var3 = ["1/06/2007", "$1.4000", "$1.0000"] 
     ["2/05/2008", "$1.5000", "$2.0000"] 

Und das ist der Code, wie ich bei diesen Anordnungen above..not einen guten Code Rubin ankommen ich es bestätigen

var1 = Nokogiri::HTML(open(file.htm)) 
var1.xpath('//tr[position() > 1]').map do |row| 
@var2 = row.xpath('td').map(&:text)[0,3] 
    puts @var2 
end 

File.open('some.txt') do |file| 
    file.each_line do |line| 
    line1 = line.split(' ') 
    line2 = line1[0] 
    line3 = "$" + line1[1] 
    line4 = "$" + line1[2] 

    @var3 = line2.split(' ') + line3.split(' ') + line4.split(' ') 
    puts @var3 
    end 
    file.close() 
end 

In diesen beiden Variablen Ich habe mehrere Zeilen wie diese. Wie kann ich @var2 und @var3 vergleichen? Auch @var2 ist in absteigender Reihenfolge des Datums. Gibt es eine Möglichkeit, die Werte/Inhalte der beiden zu vergleichen und ein Ergebnis zu erhalten? Dies bedeutet auch, dass mit dem obigen Format, wenn ich einen Wert in eines des Arrays ändern sollte der Vergleich fehlschlagen, zum Beispiel:

@var2 = ["2/05/2008", "$1.5000", "$2.0000"] 
     ["1/06/2007", "$1.4000", "$1.0000"] 

@var3 = ["1/06/2007", "$1.4456", "$1.0000"] 
     ["2/05/2008", "$1.5000", "$2.2222"] 

ich mehr Möglichkeiten ausprobiert, aber leider ist es nicht funktioniert. Ich denke, ich muss in die Arrays hineinschleifen und vergleichen, aber nicht sicher, wie es geht.

Ich habe versucht @var2 & @var3, @var2 - @var3. Sie scheinen nicht zu funktionieren, wenn ich einen Wert in einem der Arrays ändere. Der Vergleich scheint immer noch nach dem Index zu suchen und sagt, dass Übereinstimmungen gefunden wurden. Ich möchte einen genauen zeilenweisen Vergleich mit den Werten in jedem Array.

auch weitere Informationen: -

Ich möchte wissen, ob das Array genau die gleichen Elemente enthält, ist die Reihenfolge keine Rolle.

In den beiden Arrays var2 und var3 können Duplikate vorkommen. Die Array-Größen sind identisch. Es wird nicht weniger Elemente geben als NILs.

+2

Die Hälfte Ihrer Daten tun können, ist nicht in allen Variablen, gehe ich davon aus sie sollten verschachtelte Arrays sein? –

+0

Auch Ihre Frage ist sehr unklar: Möchten Sie wissen, ob die Arrays die gleichen Elemente enthalten, unabhängig von der Reihenfolge? Oder bestellt Ordnung? Sind alle Elemente einzigartig? –

+0

@Andrew, ja es tut mir leid, sie sind verschachtelte Arrays. und möchten wissen, ob das Array genau dieselben Elemente enthält, spielt die Reihenfolge keine Rolle. – user1126946

Antwort

0

Wie wäre es

@var2.reverse == @var3 
+0

Danke, aber das wird nicht funktionieren, Kumpel. Ich möchte etwas, wo ich jeden einzelnen Wert im Array "@ var2 to @ var3" vergleichen könnte.Wenn ich zum Beispiel einen Wert in "@ var3" von ["2/5/2008", "$ 1,5000", "$ 2,0000"] zu ["2/05/2008", "$ 1,5000", "$ 2,22222"] ändere, dann sollte der Vergleich zu "@ var2" falsch und fehlerfrei sein. Hoffe, dass hilft – user1126946

+0

Ich möchte etwas, wo ich in der Lage wäre, durch die Werte der Arrays zu durchlaufen – user1126946

+2

Haben Sie den Code versuchen? Es sollte jedes Element des Arrays vergleichen und false zurückgeben, auch wenn eine Sache nicht übereinstimmt. – Dogbert

1

vergleichen ihre Länge mit der Länge ihrer intersection:

@var2.length == @var3.length && @var2.length == (@var2 & @var3).length 
+0

, dass der richtige Weg, es zu tun. Bearbeitet den offensichtlichen Fehler –

+0

Danke für die Bearbeitung @ Marc-AndréLafortune! Coding für viel zu viele Stunden gerade und es ist viel zu spät und ich am Ende mache ich dumme Fehler wie das ':)'. –

+1

Beachten Sie, dass die Lösung annimmt, dass keine Duplikate vorhanden sind. –

2

sortieren die Arrays, bevor Sie sie vergleichen:

@var2.sort == @var3.sort 

Es sei denn, ich bin fehlt etwas, das ist im Grunde, was das Problem ist.

+0

Hallo, Danke für die Antwort. Ich habe die ursprüngliche Frage aktualisiert. Bitte guck dir das an. Danke – user1126946

+0

Sortieren funktionierte nicht für mich. – user1126946

0

Mit - Betreiber von Array Klasse

2.1.1 :006 > arr1 = [1,2,3,4] 
=> [1, 2, 3, 4] 
2.1.1 :007 > arr2 = [4,3,2,1] 
=> [4, 3, 2, 1] 
2.1.1 :008 > arr1-arr2 
=> [] 
2.1.1 :009 > 

So können Sie es wie dieses gegeben

2.1.1 :001 > @var2 = [["2/05/2008", "$1.5000", "$2.0000"], 
2.1.1 :002 >    ["1/06/2007", "$1.4000", "$1.0000"] ] 
=> [["2/05/2008", "$1.5000", "$2.0000"], ["1/06/2007", "$1.4000", "$1.0000"]] 
2.1.1 :003 > 
2.1.1 :004 > @var3 = [["1/06/2007", "$1.4000", "$1.0000"], 
2.1.1 :005 >    ["2/05/2008", "$1.5000", "$2.0000"]] 
=> [["1/06/2007", "$1.4000", "$1.0000"], ["2/05/2008", "$1.5000", "$2.0000"]] 
2.1.1 :006 > (@var2 - @var3) == [] 
=> true 
2.1.1 :007 >