2016-05-06 12 views
1

Ich habe zwei Arrays, die Tausende von Elementen haben. Ich muss herausfinden, welche Elemente in einem Array fehlen, indem ich es mit einem anderen vergleiche. Gibt es eine Möglichkeit, die fehlenden Elemente zu erhalten, ohne das gesamte Array durchlaufen zu müssen? Oder gibt es etwas schneller als das, was ich mache? HierVergleichen Sie zwei Array für fehlende Elemente in Ruby

ist das, was ich jetzt benutze:

def find_missing(array1, array2) 
    missing_elements = [] 
    array1.each { |e| 
     unless array2.include? e 
      missing_elements << e 
     end 
    } 

    return missing_elements 
end 

array1 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 
array2 = [1, 2, 4, 5, 6, 7, 9] 

puts find_missing(array1, array2) 

Antwort

7

Sie möchten eine Kopie des ersten Arrays, aber alle Elemente zu entfernen, die in der zweiten Reihe erscheint ? Das ist, was Array#- (array Unterschied) tut:

array1 - array2 
# => [10, 8, 3] 
+0

Schön und sauber. Vielen Dank. – MrAutoIt

+1

@MrAutoIt Die Array-Klasse verfügt über eine Reihe dieser praktischen Methoden. Wenn Sie jemals wissen wollen, welche Werkzeuge es gibt, [überprüfen Sie die Dokumentation] (http://ruby-doc.org/core-2.3.0/Array.html), da es eine Menge Dinge zu genießen gibt. – tadman

2

Sie können einfach verwenden the difference operator

@irb(main):001:0> array1 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 
@irb(main):002:0> array2 = [1, 2, 4, 5, 6, 7, 9] 
=> [1, 2, 4, 5, 6, 7, 9] 
@irb(main):003:0> array1 - array2 
=> [10, 8, 3] 
1

Ich bezweifle, dass Sie array1 - array2, Array#- ist codiert in C schlagen können, aber Sie könnten zum Benchmark wollen sie gegen:

require 'set' 

def use_sets(array1, array2) 
    a1 = array1.uniq 
    s2 = array2.to_set 
    a1.reject { |e| s2.include?(e) } 
end 

hinzugefügt ..

require 'fruity' 

def compare_em(array1, array2) 
    compare do 
    _minus { array1 - array2 } 
    _sets { use_sets(array1, array2) } 
    end 
end 

n = 100_000 
array1 = (1..n).to_a.shuffle 
array2 = (1..n-2).to_a.shuffle 
compare_em(array1, array2) 
    #_minus is faster than _sets by 2x ± 1.0 

n = 1_000_000 
array1 = (1..n).to_a.shuffle 
array2 = (1..n-2).to_a.shuffle 
compare_em(array1, array2) 
    #_minus is faster than _sets by 2x ± 1.0 

n = 100_000 
array1 = (([1]*n).concat [1,2]).shuffle 
array2 = [1]*n 
compare_em(array1, array2) 
    #_minus is faster than _sets by 5x ± 1.0 
Verwandte Themen