380 Stimmen

Entfernen Sie doppelte Elemente aus dem Array in Ruby

Ich habe ein Ruby-Array, das doppelte Elemente enthält.

array = [1,2,2,1,4,4,5,6,7,8,5,6]

Wie kann ich alle doppelten Elemente aus diesem Array entfernen, während ich alle einzigartigen Elemente beibehalte, ohne for-Schleifen und Iteration zu verwenden?

13voto

Victor Punkte 1140

Die einfachsten Wege für mich sind diese:

array = [1, 2, 2, 3]

Array#to_set

array.to_set.to_a

# [1, 2, 3]

Array#uniq

array.uniq

# [1, 2, 3]

3voto

the Tin Man Punkte 154584

Nur um einige Einblicke zu geben:

require 'fruity'
require 'set'

array = [1,2,2,1,4,4,5,6,7,8,5,6] * 1_000

def mithun_sasidharan(ary)
  ary.uniq
end

def jaredsmith(ary)
  ary & ary
end

def lri(ary)
  counts = Hash.new(0)
  ary.each { |v| counts[v] += 1 }
  counts.select { |v, count| count == 1 }.keys 
end

def finks(ary)
  ary.to_set
end

def santosh_mohanty(ary)
    result = ary.reject.with_index do |ele,index|
      res = (ary[index+1] ^ ele)
      res == 0
    end
end

SHORT_ARRAY = [1,1,2,2,3,1]
mithun_sasidharan(SHORT_ARRAY) # => [1, 2, 3]
jaredsmith(SHORT_ARRAY) # => [1, 2, 3]
lri(SHORT_ARRAY) # => [3]
finks(SHORT_ARRAY) # => #
santosh_mohanty(SHORT_ARRAY) # => [1, 2, 3, 1]

puts 'Ruby v%s' % RUBY_VERSION

compare do
  _mithun_sasidharan { mithun_sasidharan(array) }
  _jaredsmith { jaredsmith(array) }
  _lri { lri(array) }
  _finks { finks(array) }
  _santosh_mohanty { santosh_mohanty(array) }

Das resultiert beim Ausführen in:

# >> Ruby v2.7.1
# >> Jeder Test wird 16 Mal ausgeführt. Der Test dauert etwa 2 Sekunden.
# >> _mithun_sasidharan ist 2x ± 0.1 schneller als _jaredsmith
# >> _jaredsmith ist 4x ± 0.1 schneller als _santosh_mohanty (Ergebnisse unterscheiden sich: [1, 2, 4, 5, 6, 7, 8] vs [1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, 6, 1, 2, 1, 4, 5, 6, 7, 8, 5, ...
# >> _santosh_mohanty ist ähnlich wie _lri (Ergebnisse unterscheiden sich: [1, 2, 1, 4, 5, 6, 7, 8, 5, 6, ...] vs [] )
# >> _lri ist ähnlich wie _finks (Ergebnisse unterscheiden sich: [] vs #)

Anmerkung: Diese haben schlechte Ergebnisse geliefert:

  • lri(SHORT_ARRAY) # => [3]
  • finks(SHORT_ARRAY) # => #
  • santosh_mohanty(SHORT_ARRAY) # => [1, 2, 3, 1]

-4voto

Santosh Mohanty Punkte 458

Versuchen Sie, den XOR-Operator zu verwenden, ohne eingebaute Funktionen zu verwenden:

a = [3,2,3,2,3,5,6,7].sort!

result = a.reject.with_index do |ele,index|
  res = (a[index+1] ^ ele)
  res == 0
end

print result

Mit eingebauten Funktionen:

a = [3,2,3,2,3,5,6,7]

a.uniq

3 Stimmen

Ich habe nicht gevotet und kenne praktisch nichts über Ruby, aber ist .sort! nicht auch eine eingebaute Funktion?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X