රූබි හි අරාවෙහි අගයක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද


1325

මට වටිනාකමක් 'Dog'සහ අරාවක් ['Cat', 'Dog', 'Bird']තිබේ.

එය අරාව තුළ නොනවත්වා පවතින්නේ දැයි පරීක්ෂා කරන්නේ කෙසේද? වටිනාකම තිබේදැයි පරීක්ෂා කිරීමට සරල ක්‍රමයක් තිබේද, ඊට වඩා දෙයක් නැත?


5
.include භාවිතා කරන්න ? ක්‍රමය . එය ඔබට අවශ්‍ය බූලියන් ආපසු ලබා දෙයි. ඔබේ නඩුවේදී ටයිප් කරන්න: ['බළලා', 'බල්ලා', 'කුරුල්ලා'] ඇතුළත් කරන්න ('බල්ලා'), එය බූලියන් සත්‍යය නැවත ලබා දිය යුතුය.
ජුවන් 622

ඇතුළත් නොකරන්නේද ? ක්‍රමයේ විවිධ අගයන් අරාවෙහි තිබේද යන්න සඳහා ගුණක වාර ගණනක් පරීක්ෂා කිරීමට අවශ්‍ය නම් හෝ ඇතුළත් කර ඇති නිසා නොවේද? සෑම hash = arr.map {|x| [x,true]}.to_hhash.has_key? 'Dog'
වේලාවක්ම

3
ඔබට එය මුළුමනින්ම "එය හරහා නොගෙන" කළ නොහැක. එය තර්කානුකූලව කළ නොහැකි ය, පරිගණකයට අරාවෙහි මූලද්‍රව්‍යය හරහා ලූපයකින් තොරව මූලද්‍රව්‍යය අඩංගු දැයි නිශ්චිතවම දැනගත නොහැක. එය හිස් නොවේ නම්, ඇත්ත වශයෙන්ම. එවිට මම හිතන්නේ ඔබට ලූපයක් අවශ්‍ය නොවේ.
ටිම් එම්

අරා සහ කට්ටලයක මූලද්‍රව්‍යයක් සොයා ගැනීමට විවිධ ක්‍රමවල වෙනස පරීක්ෂා කිරීම සඳහා පහත මිණුම් සලකුණු බලන්න. stackoverflow.com/a/60404934/128421
ටින් මෑන්

Answers:


1964

ඔබ සොයන්නේ include?:

>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true

73
විකල්ප වාක්‍ය %w(Cat Dog Bird).include? 'Dog'
ඛණ්ඩය

187
සමහර විට එය "අඩංගු" නොවන්නේ යැයි මම සිතමි. මම සෑම විටම එය ඇතුළත් කිරීම් සමඟ මිශ්‍ර කරමි.
හෙන්ලි චියූ

19
අභ්‍යන්තරව, #include?තවමත් ලූප ක්‍රියා කරන බව මම සටහන් කරමි . කෝඩරය පැහැදිලිවම ලූපය ලිවීමෙන් සුරකින ලදි. මම පිළිතුරක් එකතු කර ඇත්තෙමි.
බොරිස් ස්ටිට්නිකි

8
En හෙන්ලිචියූ I එය හැඳින්වූයේ[ 'Dog', 'Bird', 'Cat' ].has? 'Dog'

4
Lf ඇල්ෆොන්සෝවර්ගරා ඔව්, අරාව සඳහා වන ඕනෑම විසඳුමක් අභ්‍යන්තරව යම් ආකාරයක ලූපයක් කළ යුතුය; ලූපයකින් තොරව අරාවෙහි සාමාජිකත්වය පරීක්ෂා කිරීමට ක්‍රමයක් නොමැත. අභ්‍යන්තරව පවා ලූපයක් කිරීමට ඔබට අවශ්‍ය නැතිනම්, ස්ථාවර ප්‍රමාණයේ යතුරු සහිත පරිපූර්ණ හැෂ් වගුවක් වැනි වෙනස් දත්ත ව්‍යුහයක් භාවිතා කිරීමට ඔබට අවශ්‍යය. අභ්‍යන්තරව ලූපයක් නොමැතිව අරාවෙහි සාමාජිකත්වය පරීක්ෂා කිරීමට ක්‍රමයක් නොමැති හෙයින්, මම එම ප්‍රශ්නය අර්ථකථනය කළේ “මා විසින්ම පැහැදිලිවම ලූපය
බ්‍රයන් කැම්බල්

256

එහි දී ය in?ක්රමය තුළ ActiveSupport@campaterson පෙන්වා දෙන පරිදි, v3.1 සිට (රේල් පීලි කොටසක්). එබැවින් රේල්ස් තුළ, හෝ ඔබට නම් require 'active_support', ඔබට ලිවිය හැකිය:

'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false

OTOH, රුබී තුළම inක්‍රියාකරුවෙකු හෝ #in?ක්‍රමවේදයක් නොමැත , එය මීට පෙර යෝජනා කර තිබුණද, විශේෂයෙන් යූසුකේ එන්ඩෝ විසින් රූබි- කෝර් හි ඉහළ පෙළේ සාමාජිකයෙකි.

වෙනත් අය විසින් උල් පිටතට ලෙස, ආපසු ක්රමය include?සියලු පවතී, Enumerableඇතුළු හි Array, Hash, Set, Range:

['Cat', 'Dog', 'Bird'].include?('Unicorn') # => false

ඔබගේ අරාවෙහි ඔබට බොහෝ අගයන් තිබේ නම්, ඒවා සියල්ලම එකින් එක පරීක්ෂා කරනු ලැබේ (එනම් O(n)), හෑෂ් සෙවීම නියත කාලය (එනම් O(1)) වනු ඇති බව සලකන්න . එබැවින් ඔබ අරාව නියත නම්, උදාහරණයක් ලෙස, කට්ටලයක් භාවිතා කිරීම හොඳ අදහසකි . උදා:

require 'set'
ALLOWED_METHODS = Set[:to_s, :to_i, :upcase, :downcase
                       # etc
                     ]

def foo(what)
  raise "Not allowed" unless ALLOWED_METHODS.include?(what.to_sym)
  bar.send(what)
end

ඉක්මන් පරීක්ෂණයක් ඉල්ලා අනාවරණය include?10 අංගයක් මත Setවේගවත් සමාන මත ඉල්ලා වඩා 3.5x පමණ වන Array(එම මූලද්රව්යය සොයා ගැනීමට අපහසු නම්).

අවසාන අවසාන සටහන: include?a භාවිතා කරන විට ප්‍රවේශම් Rangeවන්න, සියුම්කම් ඇත, එබැවින් ලේඛනය වෙත යොමු කර සසඳන්න cover?...


2
රූබි එහි හරයට ඇතුළත් නොවූවත් #in?, ඔබ රේල්ස් භාවිතා කරන්නේ නම්, එය ලබා ගත හැකිය. api.rubyonrails.org/classes/Object.html#method-i-in-3F (මම දන්නවා මෙය රූබියක් මිස රේල්ස් ප්‍රශ්නයක් නොවන බව, නමුත් එය #in?රේල්ස් වල භාවිතා කිරීමට බලාපොරොත්තු වන ඕනෑම කෙනෙකුට උදව් විය හැකිය . එය රේල්ස් වල එකතු කළ බවක් පෙනේ 3.1 apidock.com/rails/Object/in%3F
campeterson

168

උත්සාහ කරන්න

['Cat', 'Dog', 'Bird'].include?('Dog')

මෙය පැරණි වාක්‍ය
ඛණ්ඩයයි

62
ajahrichie මෙම පිළිතුරේ “පැරණි සින්ටැක්ස්”, විකල්ප වරහන් වර්‍ගයන් ලෙස ඔබ සලකන්නේ කුමක්ද?
ඩෙනිස්

3
මම එකඟ වෙමි en ඩෙනිස්, මෙය පැරණි නොවේ, වරහන් වර්‍ග විකල්පයක් වන අතර බොහෝ අවස්ථාවන්හිදී හොඳ පුහුණුවක් .... වර්‍ගයක් නොමැතිව වර්‍ග රහිතව එක් පේළියක ඇතුළත් කිරීමට උත්සාහ කරන්න, උදාහරණයක් ලෙස වාක්‍යයක් නම්, මා අදහස් කළේ ඔබේ නඩුව අනුව ඔබ වරහන් භාවිතා කළ යුතුද නැද්ද යන්න ("පැරණි" රූබි
සින්ටැක්ස්

ත්‍රිමාණ මෙහෙයුමක් තුළ මට වැඩ කිරීමට හැකි එකම වාක්‍ය ඛණ්ඩය මෙයයි.
මයිකල් කැමරන්

50

භාවිතා කරන්න Enumerable#include:

a = %w/Cat Dog Bird/

a.include? 'Dog'

නැතහොත්, පරීක්ෂණ ගණනාවක් සිදු කරන්නේ නම්, 1 ඔබට ලූපය ඉවත් කර ගත හැකිය (එය පවා include?ඇත) සහ O (n) සිට O (1) වෙත යන්න:

h = Hash[[a, a].transpose]
h['Dog']


1. මෙය පැහැදිලිව පෙනෙන නමුත් විරෝධතා මඟහරවා ගැනීමට යැයි මම විශ්වාස කරමි: ඔව්, බැලූ බැල්මට ස්වල්පයක් සඳහා, හැෂ් [සහ ට්‍රාන්ස්පෝස් ඔප්ස් පැතිකඩෙහි ආධිපත්‍යය දරන අතර ඒවා සෑම ඕ (එන්) ම වේ.


50

ඔබ වාරණ විසින් පරීක්ෂා කිරීමට අවශ්ය නම්, ඔබ උත්සාහ කල හැකි any?හෝ all?.

%w{ant bear cat}.any? {|word| word.length >= 3}   #=> true  
%w{ant bear cat}.any? {|word| word.length >= 4}   #=> true  
[ nil, true, 99 ].any?                            #=> true  

බලන්න ගණ්ය වැඩි විස්තර සඳහා.

මගේ ආභාසය ලැබුනේ " අරාවෙහි කිසියම් අයිතමයක් තිබේදැයි තක්සේරු කරන්න "


1
ඔබට පරීක්ෂා කිරීමට අවශ්‍ය නම් ඉතා ප්‍රයෝජනවත් වේ / එම නූල් සියල්ලම වෙනත්
නූලකට

43

රූබිට අරාවෙහි මූලද්‍රව්‍ය සොයා ගැනීමට ක්‍රම එකොළහක් ඇත.

කැමති එකක් include?හෝ, නැවත නැවත පිවිසීම සඳහා, කට්ටලයක් සාදන්න, පසුව අමතන්න include?හෝmember? .

මෙන්න ඒවා සියල්ලම:

array.include?(element) # preferred method
array.member?(element)
array.to_set.include?(element)
array.to_set.member?(element)
array.index(element) > 0
array.find_index(element) > 0
array.index { |each| each == element } > 0
array.find_index { |each| each == element } > 0
array.any? { |each| each == element }
array.find { |each| each == element } != nil
array.detect { |each| each == element } != nil

ඔවුන් සියල්ලෝම ආපසු එති trueමූලද්රව්යය තිබේ නම් ඊෂ් අගයක් ලබා දෙයි.

include?යනු වඩාත් කැමති ක්‍රමයයි. එය forඅභ්‍යන්තරව සී-භාෂා පුඩුවක් භාවිතා කරයි rb_equal_opt/rb_equal. ඔබ නැවත නැවත සාමාජික චෙක්පත් සඳහා කට්ටලයක් සාදන්නේ නම් එය වඩාත් කාර්යක්ෂම කළ නොහැක.

VALUE
rb_ary_includes(VALUE ary, VALUE item)
{
  long i;
  VALUE e;

  for (i=0; i<RARRAY_LEN(ary); i++) {
    e = RARRAY_AREF(ary, i);
    switch (rb_equal_opt(e, item)) {
      case Qundef:
        if (rb_equal(e, item)) return Qtrue;
        break;
      case Qtrue:
        return Qtrue;
    }
  }
  return Qfalse;
}

member?Arrayපංතිය තුළ නැවත අර්ථ දක්වා නොමැති අතර Enumerableසියලු අංග හරහා වචනාර්ථයෙන් ගණනය කරන මොඩියුලයෙන් භාවිතයට නොගත් ක්‍රියාත්මක කිරීමක් භාවිතා කරයි :

static VALUE
member_i(RB_BLOCK_CALL_FUNC_ARGLIST(iter, args))
{
  struct MEMO *memo = MEMO_CAST(args);

  if (rb_equal(rb_enum_values_pack(argc, argv), memo->v1)) {
    MEMO_V2_SET(memo, Qtrue);
    rb_iter_break();
  }
  return Qnil;
}

static VALUE
enum_member(VALUE obj, VALUE val)
{
  struct MEMO *memo = MEMO_NEW(val, Qfalse, 0);

  rb_block_call(obj, id_each, 0, 0, member_i, (VALUE)memo);
  return memo->v2;
}

රූබි කේතයට පරිවර්තනය කර ඇති මෙය පහත සඳහන් දේ කරයි:

def member?(value)
  memo = [value, false, 0]
  each_with_object(memo) do |each, memo|
    if each == memo[0]
      memo[1] = true 
      break
    end
  memo[1]
end

අපේක්ෂිත අගයේ පළමු සිදුවීම සඳහා දෙකම අරාව සොයන බැවින් දෙකම include?සහ member?O (n) කාල සංකීර්ණතාවයක් ඇත.

මුලින් අරාවෙහි හැෂ් නිරූපණයක් සෑදීමේ වියදමින් O (1) ප්‍රවේශ වේලාව ලබා ගැනීමට අපට කට්ටලයක් භාවිතා කළ හැකිය. ඔබ එකම පෙළේ සාමාජිකත්වය නැවත නැවත පරීක්ෂා කරන්නේ නම් මෙම ආරම්භක ආයෝජනය ඉක්මනින් ගෙවිය හැකිය. SetC හි ක්‍රියාත්මක නොවන නමුත් සරල රූබි පන්තියක් ලෙස තවමත් යටින් පවතින O (1) ප්‍රවේශ කාලය@hash මෙය වටී.

සෙට් පන්තිය ක්‍රියාත්මක කිරීම මෙන්න:

module Enumerable
  def to_set(klass = Set, *args, &block)
    klass.new(self, *args, &block)
  end
end

class Set
  def initialize(enum = nil, &block) # :yields: o
    @hash ||= Hash.new
    enum.nil? and return
    if block
      do_with_enum(enum) { |o| add(block[o]) }
    else
      merge(enum)
    end
  end

  def merge(enum)
    if enum.instance_of?(self.class)
      @hash.update(enum.instance_variable_get(:@hash))
    else
      do_with_enum(enum) { |o| add(o) }
    end
    self
  end

  def add(o)
    @hash[o] = true
    self
  end

  def include?(o)
    @hash.include?(o)
  end
  alias member? include?

  ...
end

සෙට් පන්තිය අභ්‍යන්තර @hashනිදසුනක් නිර්මාණය කරන බව ඔබට පෙනෙන පරිදි , සියලු වස්තූන් සිතියම් ගත කර පසුව හැෂ් පන්තියේ O (1) ප්‍රවේශ වේලාව සමඟ ක්‍රියාත්මක වන trueසාමාජිකත්වය පරීක්ෂා Hash#include?කරයි.

අනෙක් ක්‍රම 7 ම කාර්යක්ෂම නොවන බැවින් මම සාකච්ඡා නොකරමි.

ඉහත ලැයිස්තුගත කර ඇති 11 න් ඔබ්බට O (n) සංකීර්ණතාවයෙන් තවත් බොහෝ ක්‍රම තිබේ, නමුත් පළමු තරඟයේ දී බිඳවැටීමට වඩා සමස්ත අරා පරිලෝකනය කරන බැවින් ඒවා ලැයිස්තුගත නොකිරීමට මම තීරණය කළෙමි.

මේවා භාවිතා නොකරන්න:

# bad examples
array.grep(element).any? 
array.select { |each| each == element }.size > 0
...

රූබිට ඕනෑම දෙයක් කිරීමට හරියටම ක්‍රම 11 ක් ඇති බව පැවසීම කෙතරම් නිර්ලජ්ජිතද! ඔබ # 12, පසුව # 13, සහ යනාදිය මඟ හැරුණු බව යමෙකු පෙන්වා දෙනු ඇතැයි ඔබ පැවසූ විගසම. මගේ අදහස ඉදිරිපත් කිරීම සඳහා මම වෙනත් ක්‍රම යෝජනා කරමි, නමුත් පළමුව 11ඔබ ගණන් බලා ඇති ක්‍රම ප්‍රශ්න කිරීමට මට ඉඩ දෙන්න . පළමුව, ඔබ කිසිසේත් ගණන් කළ indexහා find_index(හෝ findසහ detectවෙනම ක්රම ලෙස, ඒ හා සමගාමීව ඔවුන් විසින් ක්රමය සඳහා පමණක් විවිධ නම් වේ වැනි) ඒ අතර වේ. දෙවනුව, අවසන් වන සියලුම ප්‍රකාශන > 0වැරදියි, එය අධීක්ෂණයක් බව මට විශ්වාසයි. (cont.)
cont Cary Swoveland

... arr.index(e), උදාහරණයක් ලෙස, නැවත 0නම් arr[0] == e. ඔබට මතක ඇත arr.index(e)ප්රතිලාභ nilනම් eවර්තමාන නොවේ. indexඑක් සොයමින් නම්, කෙසේ වෙතත්, භාවිතා කළ නොහැකි nilදී arr. ( rindexලැයිස්තුගත කර නොමැති එකම ගැටළුව .). අරාව කට්ටලයක් බවට පරිවර්තනය කර කට්ටල ක්‍රම භාවිතා කිරීම ටිකක් දිගු කිරීමකි. එසේනම් (අරා සිට යතුරු සහ අත්තනෝමතික අගයන් සහිත) හැෂ් බවට පරිවර්තනය නොවන්නේ නම්, පසුව හැෂ් ක්‍රම භාවිතා කරන්න. කට්ටලයක් බවට පරිවර්තනය කිරීම හරි වුවත්, භාවිතා කළ හැකි වෙනත් කට්ටල ක්‍රම තිබේ !arr.to_set.add?(e). (
cont

... පොරොන්දු වූ පරිදි, මෙහි භාවිත කළ හැකි බව කිහිපයක් වැඩි ක්රම ඇත: arr.count(e) > 0, arr != arr.dup.delete(e) , arr != arr - [e]සහ arr & [e] == [e]. කෙනෙකුට රැකියාවක් කළ හැකි selectඅතර reject.
කැරි ස්වෝව්ලන්ඩ්

අනුපිටපත් වලට ඉඩ නොදීම සහ ලැයිස්තුවේ කිසියම් අංගයක් තිබේද යන්න දැන ගැනීම සඳහා නිර්ණායකයක් නම් කට්ටලයක් භාවිතා කිරීම මම තරයේ නිර්දේශ කරමි . කට්ටලය SOooo වඩා වේගවත් ය. සෙවීම අවශ්‍ය වූ විට අරා සැබවින්ම භාවිතා නොකළ යුතුය; ඒවා පිළිවෙලට සැකසීමට තාවකාලිකව ගබඩා කර ඇති පෝලිමක් ලෙස වඩා හොඳය. යමක් තිබේදැයි බැලීමට හැෂ් සහ සෙට් වඩා හොඳය.
ටින් මෑන්

31

පිළිතුරු කිහිපයක් යෝජනා කරයි Array#include?, නමුත් එක් වැදගත් අවවාදයක් ඇත: ප්‍රභවය දෙස බැලීමේදී පවා Array#include?ලූප කිරීම සිදු කරයි:

rb_ary_includes(VALUE ary, VALUE item)
{
    long i;

    for (i=0; i<RARRAY_LEN(ary); i++) {
        if (rb_equal(RARRAY_AREF(ary, i), item)) {
            return Qtrue;
        }
    }
    return Qfalse;
}

වචනය පැවතීමකින් තොරව පරික්ෂා කිරීම සඳහා ක්‍රමය වන්නේ ඔබේ අරාව සඳහා ත්‍රිත්වයක් සෑදීමයි . ට්‍රයි ක්‍රියාත්මක කිරීම් බොහොමයක් තිබේ (ගූගල් "රූබි ට්‍රයි"). මම rambling-trieමෙම උදාහරණයේ භාවිතා කරමි :

a = %w/cat dog bird/

require 'rambling-trie' # if necessary, gem install rambling-trie
trie = Rambling::Trie.create { |trie| a.each do |e| trie << e end }

දැන් අපි ඔබේ අරාවෙහි විවිධ වචන ඇති බව පරීක්ෂා කර බැලීමට සූදානම්ව සිටිමු. O(log n)කාලයාගේ ඇවෑමෙන්, උප Array#include?රේඛීය භාවිතා කරමින් සින්ටැක්ටික් සරල බව සමඟ Trie#include?:

trie.include? 'bird' #=> true
trie.include? 'duck' #=> false

8
a.each do ... endම්ම් ... එය ලූපයක් නොවන්නේ කෙසේදැයි විශ්වාස නැත
tckmn

27
මෙහි ඇත්ත වශයෙන්ම ලූපයක් ඇතුළත් බව සලකන්න; O (1) නොවන ඕනෑම දෙයකට යම් ආකාරයක ලූපයක් ඇතුළත් වේ. එය සිදුවන්නේ ආදාන නූලෙහි අක්ෂරවලට වඩා ලූපයක් ලෙස ය. Set#include?කාර්යක්ෂමතාව ගැන සැලකිලිමත් වන පුද්ගලයින් සඳහා දැනටමත් සඳහන් කර ඇති පිළිතුරකට වඩා සටහන් කරන්න ; නූල් වෙනුවට සංකේත භාවිතා කිරීම සමඟ එය O (1) සාමාන්‍ය අවස්ථාව විය හැකිය (ඔබ නූල් භාවිතා කරන්නේ නම්, හැෂ් ගණනය කිරීම O (n) වන අතර n යනු නූල් වල දිග වේ). නැතහොත් ඔබට තෙවන පාර්ශවීය පුස්තකාල භාවිතා කිරීමට අවශ්‍ය නම්, ඔබට O (1) නරකම අවස්ථාව වන පරිපූර්ණ හැෂ් භාවිතා කළ හැකිය.
බ්‍රයන් කැම්බල්

4
AFAIK, Setඑහි සාමාජිකයින් සුචිගත කිරීම සඳහා හැෂ් භාවිතා කරයි, එබැවින් ඇත්ත වශයෙන්ම හොඳින් බෙදා හරින ලද (වඩාත් නිශ්චිතවම O (ආදාන ප්‍රමාණය) හැෂිං සඳහා O (1) සහ O (ලොග් (n / බාල්දි අංකය)) සඳහා සංකීර්ණ Set#include? විය යුතුය. Setසෙවීම)
යූරි අගාසි

11
ත්‍රිකෝණය නිර්මාණය කිරීම හා නඩත්තු කිරීම සඳහා වන පිරිවැය ද එසේමය. ඔබ අරාවෙහි බොහෝ සෙවුම් මෙහෙයුම් කරන්නේ නම්, ට්‍රයි එකක් ජනනය කර එය නඩත්තු කිරීමේ මතකය හා කාලය පිරිවැය වටී, නමුත් තනි හෝ සිය ගණනක් හෝ දහස් ගණනක් චෙක්පත් සඳහා ඕ (එන්) පරිපූර්ණව සුදුසු ය. පරායත්තතා එකතු කිරීම අවශ්‍ය නොවන තවත් විකල්පයක් වනුයේ අරාව වර්ග කිරීම හෝ පිළිවෙලට පිළිවෙලට පවත්වා ගැනීමයි, එවැනි අවස්ථාවක ඇතුළත් කිරීම පරීක්ෂා කිරීම සඳහා ද්විමය සෙවුම් O (lg n) මෙහෙයුමක් භාවිතා කළ හැකිය.
කථන

1
කථා කිරීමේ කේතය, ඔබ ප්‍රායෝගික දෘෂ්ටි කෝණයෙන් නිවැරදි විය හැකිය. නමුත් OP ඉල්ලා සිටින්නේ "වටිනාකම තිබේදැයි පරීක්ෂා කරන්න, ඊට වඩා දෙයක් නැත, ලූපයකින් තොරව". මම මෙම පිළිතුර ලියන විට, මෙහි ප්‍රායෝගික විසඳුම් රාශියක් තිබුනද, ඇත්ත වශයෙන්ම අසන්නන්ගේ වචනාර්ථය සපුරාලන කිසිවක් නැත. බීඑස්ටී උත්සාහයන් හා සම්බන්ධ බව ඔබ නිරීක්ෂණය කිරීම නිවැරදිය, නමුත් නූල් සඳහා, ට්‍රයි යනු රැකියාව සඳහා නිවැරදි මෙවලම වන අතර විකිපීඩියාව පවා එය බොහෝ දේ දනී . හොඳින් ක්‍රියාවට නංවන ලද ත්‍රිරෝද රථයක් තැනීමේ හා නඩත්තු කිරීමේ සංකීර්ණත්වය පුදුම සහගත ලෙස වාසිදායකය.
බොරිස් ස්ටිට්නිකි

20

ඔබට ලූප කිරීමට අවශ්‍ය නැතිනම්, අරා සමඟ එය කිරීමට ක්‍රමයක් නොමැත. ඒ වෙනුවට ඔබ සෙට් එකක් භාවිතා කළ යුතුය.

require 'set'
s = Set.new
100.times{|i| s << "foo#{i}"}
s.include?("foo99")
 => true
[1,2,3,4,5,6,7,8].to_set.include?(4) 
  => true

කට්ටල හෑෂ් මෙන් අභ්‍යන්තරව ක්‍රියා කරයි, එබැවින් අයිතම සොයා ගැනීම සඳහා රූබිට එකතුව හරහා ලූපයක් අවශ්‍ය නොවේ, මන්ද නමට අනුව, එය යතුරු වල හැෂ් ජනනය කර මතක සිතියමක් නිර්මාණය කරයි, එවිට සෑම හැෂ් එකක්ම මතකයේ එක්තරා ස්ථානයකට යොමු කරයි. පෙර උදාහරණය හැෂ් සමඟ කළ:

fake_array = {}
100.times{|i| fake_array["foo#{i}"] = 1}
fake_array.has_key?("foo99")
  => true

අවාසිය නම්, සෙට්ස් සහ හැෂ් යතුරු වලට ඇතුළත් කළ හැක්කේ අද්විතීය අයිතම පමණක් වන අතර ඔබ බොහෝ අයිතම එකතු කළහොත්, විශාල යතුරු අවකාශයකට ගැලපෙන නව සිතියමක් තැනීම සඳහා නිශ්චිත අයිතම ගණනකට පසුව රූබිට සියල්ල නැවත සකස් කිරීමට සිදුවනු ඇත. මේ පිළිබඳ වැඩි විස්තර සඳහා, නේතන් ලෝන්ග් විසින් රචිත " මවුන්ටන් වෙස්ට් රූබිකොන්ෆ් 2014 - බිග් ඕ" .

මෙන්න මිණුම් ලකුණක්:

require 'benchmark'
require 'set'

array = []
set   = Set.new

10_000.times do |i|
  array << "foo#{i}"
  set   << "foo#{i}"
end

Benchmark.bm do |x|
  x.report("array") { 10_000.times { array.include?("foo9999") } }
  x.report("set  ") { 10_000.times { set.include?("foo9999")   } }
end

සහ ප්‍රති results ල:

      user     system      total        real
array  7.020000   0.000000   7.020000 (  7.031525)
set    0.010000   0.000000   0.010000 (  0.004816)

ඔබ අනාවරනය භාවිතා කරන්නේ නම්, එවිට ඔබට අවම වශයෙන් ලූප අඩු කළ හැකිය. 'අනාවරණය වූ' පළමු අයිතමයෙන් අනාවරණය වීම නතර වේ (අයිතමය සඳහා සම්මත කළ කොටස සත්‍ය ලෙස තක්සේරු කරයි). ඊට අමතරව, කිසිවක් අනාවරණය නොවන්නේ නම් කුමක් කළ යුතු දැයි ඔබට පැවසිය හැකිය (ඔබට ලැම්බඩයකින් සමත් විය හැකිය).
aenw

1
hitaenw include?මුලින් පහර දෙන්නේ නැද්ද?
කිම්මෝ ලෙහ්ටෝ

ඔබ ඇත්තෙන්ම හරි. ඇතුළත් කිරීම ගැන මට එය අමතක වී ඇති බව අනාවරනය භාවිතා කිරීමට මම පුරුදුව සිටිමි. ඔබගේ අදහස් දැක්වීමට ස්තූතියි - එය මගේ දැනුම ප්‍රබෝධමත් කිරීමට සහතික විය.
aenw

include?පළමු පහරින් නතර වන නමුත් එම පහර ලැයිස්තුවේ අවසානයේ තිබේ නම් .... ගබඩා කිරීම සඳහා අරාව මත රඳා පවතින ඕනෑම විසඳුමක් ලැයිස්තුව වර්ධනය වන විට පිරිහෙන කාර්ය සාධනයක් ඇති කරයි, විශේෂයෙන් අවසානයේ දී මූලද්‍රව්‍යයක් සොයා ගැනීමට සිදු වූ විට ලැයිස්තුව. හැෂ් සහ සෙට් වලට එම ගැටලුවක් නොමැත, ඇණවුම් කළ ලැයිස්තුවක් සහ ද්විමය සෙවුමක් ද නැත.
ටින් මෑන්

මෙම පිළිතුර මුලින් ම දුන් දෙය එයයි. :)
කිම්මෝ ලෙහ්ටෝ

18

මෙය කිරීමට තවත් ක්‍රමයක්: Array#indexක්‍රමය භාවිතා කරන්න .

එය අරාවෙහි මූලද්‍රව්‍යයේ පළමු සිදුවීමේ දර්ශකය ලබා දෙයි.

උදාහරණයක් වශයෙන්:

a = ['cat','dog','horse']
if a.index('dog')
    puts "dog exists in the array"
end

index() අවහිරයක් ද ගත හැකිය:

උදාහරණයක් වශයෙන්:

a = ['cat','dog','horse']
puts a.index {|x| x.match /o/}

මෙය අරාවෙහි පළමු වචනයේ දර්ශකය 'o' අක්ෂරය අඩංගු වේ.


indexතවමත් අරාව හරහා නැවත ක්‍රියා කරයි, එය මූලද්‍රව්‍යයේ අගය ලබා දෙයි.
ටින් මෑන්

14

විනෝදජනක කාරණය,

ප්‍රකාශනයකින් *අරාව සාමාජිකත්වය පරීක්ෂා කිරීමට ඔබට භාවිතා කළ හැකිය case.

case element
when *array 
  ...
else
  ...
end

පොඩි එක බලන්න *වගන්තියේ , මෙය අරාවෙහි සාමාජිකත්වය පරීක්ෂා කරයි.

ස්ප්ලැට් ක්‍රියාකරුගේ සුපුරුදු මැජික් හැසිරීම අදාළ වේ, එබැවින් උදාහරණයක් ලෙස arrayඇත්ත වශයෙන්ම අරාවක් නොව තනි මූලද්‍රව්‍යයක් නම් එය එම මූලද්‍රව්‍යයට ගැලපේ.


දැනගැනීමට ලැබීම සතුටක් ..!
කැරි ස්වෝව්ලන්ඩ්

එය සිද්ධි ප්‍රකාශයක මන්දගාමී පළමු චෙක්පතක් වනු ඇත, එබැවින් මම අන්තිම whenහැකි ඉක්මණින් භාවිතා කරමි , එබැවින් වෙනත් වේගවත් චෙක්පත් ඉක්මනින් ඉවත් කර ගන්න.
ටින් මෑන්

11

මෙය ඉටු කර ගැනීම සඳහා විවිධ ක්‍රම තිබේ. ඒවායින් කිහිපයක් පහත පරිදි වේ:

a = [1,2,3,4,5]

2.in? a  #=> true

8.in? a #=> false

a.member? 1 #=> true

a.member? 8 #=> false

6
Object#in?රේල් පීලි (එනම් ActiveSupport) v3.1 + ට පමණක් එකතු කළ බව සලකන්න . එය මූලික රූබි වලින් ලබාගත නොහැක.
ටොම් සාමිවරයා

6

මෙය ඔබට පවතින බව පමණක් නොව එය කී වතාවක් දිස්වනවාද යන්න ඔබට කියනු ඇත:

 a = ['Cat', 'Dog', 'Bird']
 a.count("Dog")
 #=> 1

12
මෙය කොපමණ වාරයක් දිස්වේදැයි දැන ගැනීමට ඔබට අවශ්‍ය නම් මිස මෙය භාවිතා කිරීමේ කිසිදු තේරුමක් නැත, කෙසේ වෙතත්, .any?පළමු ගැලපෙන මූලද්‍රව්‍යය සොයාගත් විගසම නැවත පැමිණෙනු .countඇත, සෑම විටම මුළු අරාවම ක්‍රියාවට නංවනු ඇත.
Zaz

මෙය තාක්ෂණික වශයෙන් යමක් පවතින්නේ දැයි කියනු ඇතත් , ඔබ වේගය ගැන සැලකිලිමත් වන්නේ නම් එය කිරීමට නිවැරදි ක්‍රමය ද නොවේ .
ටින් මෑන්

6

ඔබට ඕනෑම යතුරක් සඳහා ගුණක වාර ගණනක් පරීක්ෂා කිරීමට අවශ්‍ය නම්, පරිවර්තනය arrකර hashදැන් O (1) හි පරීක්ෂා කරන්න

arr = ['Cat', 'Dog', 'Bird']
hash = arr.map {|x| [x,true]}.to_h
 => {"Cat"=>true, "Dog"=>true, "Bird"=>true}
hash["Dog"]
 => true
hash["Insect"]
 => false

හැෂ් # has_key හි කාර්ය සාධනය ? එදිරිවඅරාව # ?

පරාමිති හැෂ් # has_key? අරාව # ඇතුළත් කරන්න

කාල සංකීර්ණතාව O (1) මෙහෙයුම O (n) මෙහෙයුම 

ප්රවේශ වර්ගය ප්රවේශය හැෂ් [යතුර] එය එක් එක් මූලද්රව්යය හරහා වෙනස් වේ නම්
                        අරාවෙහි ඕනෑම අගයක් නැවත ලබා දෙයි
                        සත්‍යය අරාවෙහි ඇති සොයාගැනීම් වෙත ආපසු යවනු ලැබේ
                        හැෂ් # has_key? අමතන්න
                        අමතන්න    

තනි කාල පරික්ෂා කිරීම සඳහා භාවිතා include?කිරීම හොඳයි


එය තවමත් හැෂ් බවට පරිවර්තනය කිරීම සඳහා අරාව හරහා ලූපයක් නොවේද?
chrisjacob

2
ඔව්, මම කළා, නමුත් දැන් මට කිසියම් මූලද්‍රව්‍යයක් අරාවෙහි තිබේද නැද්ද යන්න පරීක්ෂා කිරීමට පෙර ගණනය කළ පිළිතුරක් ඇත. දැන්, ඊළඟ වතාවේ මම වෙනත් වචනයක් සොයන විට, විමසුම සඳහා එය O (1) ගතවනු ඇත, නමුත් පූර්ව ගණනය කිරීම සඳහා O (n) ගත වේ. ඇත්තටම මම භාවිතා කර ඇත්තේ ඇතුළත්ද? අරාව තුළ විශේෂිත මූලද්‍රව්‍යයක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීම සඳහා මගේ යෙදුම තුළ, එය කාර්ය සාධනය විනාශ කරයි, එය රූබි-
ප්‍රොෆ්

1
.... නමුත් O (n) අවකාශය සහ එය O (n) කාලය නොවේ, මන්ද @ chris72205 නිවැරදිව පෙන්වා දෙන පරිදි, ඔබ මුලින්ම ඔබේ අරාව හරහා නැවත යෙදිය යුතුය. O (1) + O (n) = O (n). ඉතින් ඇත්ත වශයෙන්ම, මෙය ඇතුළත් කිරීමට වඩා නරකද?
රම්බටිනෝ

මචන් මම කිව්වේ ඇතුලත ලූප ඇතුලත් කරන්න එපා, තනි කාල පරික්ෂා කිරීම ඇතුළත් කිරීම හොඳයි. එබැවින් කරුණාකර පළමුව භාවිත නඩුව කියවන්න, ඔබට ලූපය තුළ කිහිප වතාවක් පරීක්ෂා කිරීමට අවශ්‍ය නම් වඩා හොඳය.
aqfaridi

අරාව හැෂ් බවට පරිවර්තනය කිරීම මිල අධිකය, නමුත් සෙවීම සඳහා අරාවක් භාවිතා කිරීම වැරදි ව්‍යුහයකි. ඇණවුම වැදගත් විය හැකි පෝලිම් ලෙස අරා වඩා හොඳය; ඇතුළත් කිරීම / පැවැත්ම / සුවිශේෂත්වය වැදගත් වන විට හැෂ් සහ කට්ටල වඩා හොඳය. නිවැරදි බහාලුමකින් ආරම්භ කරන්න.
ටින් මෑන්

5

එය වටින දේ සඳහා, රූබි ලියකියවිලි මේ ආකාරයේ ප්‍රශ්න සඳහා පුදුමාකාර සම්පතකි.

ඔබ සොයන අරාවෙහි දිග ගැනද මම සටහන් කරමි. මෙම include?ක්‍රමය මඟින් O (n) සංකීර්ණතාවයෙන් රේඛීය සෙවුමක් ක්‍රියාත්මක කරනු ඇති අතර එය අරාවෙහි ප්‍රමාණය අනුව තරමක් කැත විය හැකිය.

ඔබ විශාල (වර්ග කළ) අරාවක් සමඟ වැඩ කරන්නේ නම්, ද්විමය සෙවුම් ඇල්ගොරිතමයක් ලිවීම ගැන මම සලකා බලමි . එය එතරම් අපහසු නොවිය යුතු අතර O (log n) හි නරකම අවස්ථාවකි.

නැතහොත් ඔබ රූබි 2.0 භාවිතා කරන්නේ නම්, ඔබට එයින් ප්‍රයෝජන ගත හැකිය bsearch.


3
ද්විමය සෙවුමක් උපකල්පනය කරන්නේ අරාව වර්ග කර ඇති බවයි (හෝ යම් ආකාරයකින් ඇණවුම් කර ඇති) එය විශාල අරා සඳහා මිල අධික විය හැකි අතර බොහෝ විට එහි වාසිය ප්‍රතික්ෂේප කරයි.
ටින් මෑන්

ද්විමය සෙවුමකට සියලු මූලද්‍රව්‍ය යුගල සමඟ සැසඳිය යුතුය <=>, එය සැමවිටම එසේ නොවේ. උදාහරණයක් ලෙස, අරාවේ මූලද්‍රව්‍ය හැෂ් යැයි සිතමු.
කැරි ස්වෝව්ලන්ඩ්

1
AryCarySwoveland, වර්ග කළ අරාවක් තුළ ඇති මූලද්‍රව්‍ය සැසඳිය හැකි බව වැඩි වශයෙන් හෝ අඩු වශයෙන් ඇඟවිය යුතුය.
davissp14

5

ඔබට උත්සාහ කළ හැකිය:

උදාහරණය: බළලා සහ බල්ලා අරාවෙහි පවතී නම්:

(['Cat','Dog','Bird'] & ['Cat','Dog'] ).size == 2   #or replace 2 with ['Cat','Dog].size

වෙනුවට:

['Cat','Dog','Bird'].member?('Cat') and ['Cat','Dog','Bird'].include?('Dog')

සටහන: member?සහ include?සමාන වේ.

මෙය එක් පේළියකින් වැඩ කළ හැකිය!


4

අපට භාවිතා නොකිරීමට අවශ්‍ය නම් include?මෙයද ක්‍රියාත්මක වේ:

['cat','dog','horse'].select{ |x| x == 'dog' }.any?

3
ඕනෑම? කුට්ටි ද පිළිගනී: ['බළලා', 'බල්ලා', 'අශ්වයා']. {| x | x == 'බල්ලා'}
මයිකොනාස්

4

කොහොමද මේ විදියට?

['Cat', 'Dog', 'Bird'].index('Dog')

මූලද්රව්යය සොයා ගැනීම සඳහා එය තවමත් අරාව හරහා නැවත ගමන් කරයි. එවිට එය එම මූලද්‍රව්‍යයේ දර්ශකය ආපසු ලබා දිය යුතුය.
ටින් මෑන්


3

ඔබ මෙය මිනි ටෙස්ට් ඒකක පරීක්ෂණයකදී කිරීමට උත්සාහ කරන්නේ නම් , ඔබට භාවිතා කළ හැකිය assert_includes. උදාහරණයක්:

pets = ['Cat', 'Dog', 'Bird']
assert_includes(pets, 'Dog')      # -> passes
assert_includes(pets, 'Zebra')    # -> fails 

3

මේ වටා වෙනත් ක්‍රමයක් තිබේ.

අරාව [ :edit, :update, :create, :show ], සමහරවිට මුළු මාරාන්තික / විවේකී පව් යැයි සිතමු .

යම් නූලකින් වලංගු ක්‍රියාවක් ඇද ගැනීමේ අදහස ඇති තවත් සෙල්ලම් බඩු :

"my brother would like me to update his profile"

ඉන්පසු:

[ :edit, :update, :create, :show ].select{|v| v if "my brother would like me to update his profile".downcase =~ /[,|.| |]#{v.to_s}[,|.| |]/}

1
ඔබේ රීජෙක්ස්, /[,|.| |]#{v.to_s}[,|.| |]/මා සිතන්නේ ඔබට 'එකකින් වට වූ ක්‍රියාවෙහි නම: කොමාව, කාල පරිච්ඡේදය, අවකාශය හෝ කිසිවක් නැත' යන්න සොයා ගැනීමට අවශ්‍ය බවය, නමුත් සියුම් දෝෂ කිහිපයක් තිබේ. "|update|"ඇති බවත් නැවත [:update]සහ "update"නැවත ශ්රී []. අක්ෂර පංති ( [...]) |අක්ෂර වෙන් කිරීම සඳහා පයිප්ප ( ) භාවිතා නොකරන්න . අපි ඒවා කණ්ඩායම් ( (...)) ලෙස වෙනස් කළත් ඔබට හිස් අක්‍ෂරයකට අනුරූප විය නොහැක. එබැවින් ඔබට බොහෝ විට අවශ්‍ය වී ඇත්තේ/(,|\.| |^)#{v.to_s}(,|\.| |$)/
bkDJ

රීජෙක්ස් හරි (පරික්ෂා කරන ලද රුබුලර්.කොම්) - සහ amb රම්බටිනෝ: උදාහරණයක් ලෙස ඇමේසන් එකෝ මෙන් වන්නේ ඇයි;) ඔබට මෙසේ පැවසිය හැකිය: “කරුණාකර මගේ සාප්පු ලැයිස්තුවට කුකුළු මස් එක් කරන්න” (සහ - හොඳයි - එවිට ඔබට සිදු විය යුතුය එකතු කරන්න: අරාවට එකතු කරන්න, නමුත් එහි සාරාංශය ඔබට ලැබෙනු ඇතැයි මම සිතමි;)
walt_die

1
"රීජෙක්ස් එක හරි (පරීක්ෂා කර ඇත්තේ rubular.com)". එය අවුලක් නැත. ඔබේ රීජෙක්ස් එක වචන මාලාවක ආරම්භයේ හෝ අවසානයේ නොගැලපේ (උදා: "මගේ සහෝදරයාගේ පැතිකඩ යාවත්කාලීන කරන්න"). ආරම්භය හෝ අවසානය /[,. ]/
ගැලපීමට

KbkDJ පවසන පරිදි, රීජෙක්ස් වැරදිය. rubular.com/r/4EG04rANz6KET6
ටින් මෑන්

2

ඔබට සත්‍යය හෝ අසත්‍යය පමණක් නොව වටිනාකම ආපසු ලබා දීමට අවශ්‍ය නම් භාවිතා කරන්න

array.find{|x| x == 'Dog'}

ලැයිස්තුවේ තිබේ නම් මෙය 'බල්ලා' යවනු ඇත, එසේ නොවේ.


නැතහොත් array.any?{|x| x == 'Dog'}ඔබට සත්‍ය / අසත්‍යය (වටිනාකම නොව) අවශ්‍ය නම් භාවිතා කරන්න , නමුත් මේ වගේ කොටසකට සංසන්දනය කිරීමට අවශ්‍යය.
mahemoff

2

ඔබට භාවිතා කිරීමට අවශ්‍ය include?නැතිනම් ඔබට මුලින් මූලද්‍රව්‍යය අරාවකින් ඔතා ඉන්පසු ඔතා ඇති මූලද්‍රව්‍යය අරාවේ ඡේදනය හා ඔතා ඇති මූලද්‍රව්‍යයට සමාන දැයි පරීක්ෂා කළ හැකිය. මෙය සමානාත්මතාවය මත පදනම් වූ බූලියන් අගයක් ලබා දෙනු ඇත.

def in_array?(array, item)
    item = [item] unless item.is_a?(Array)
    item == array & item
end

1

මෙය කිරීමට තවත් එක් ක්‍රමයක් මෙන්න:

arr = ['Cat', 'Dog', 'Bird']
e = 'Dog'

present = arr.size != (arr - [e]).size

1
මෙය කිරීමට බිහිසුණු අකාර්යක්ෂම ක්‍රමයකි! මම එය පහත් කොට සලකන්නේ එය තාක්‍ෂණිකව වැරදියි, සහ යමෙකු එය කියවීමෙන් රූබි ගැන යමක් ඉගෙන ගත හැකිය, නමුත් ඉහත වඩා හොඳ පිළිතුරු බොහොමයක් ඇත.
ජිබ්බෙරියා

කෝන්හෙඩ්, ඔබට සරල කළ හැකිය arr != arr - [e]. arr & [e] == [e]එකම රේඛා ඔස්සේ තවත් ක්‍රමයක්.
කැරි ස්වෝව්ලන්ඩ්

AryCarySwoveland මායාකාරියකගේ තොප්පියකට විහිළු නොකරන්න ;-)
වැන්ඩ් මේකර්

මා සඳහන් කළේ මායාකාරියගේ හිසට මිස තොප්පියට නොව ඉතා ගෞරවයෙන්.
කැරි ස්වෝව්ලන්ඩ්

1

ඕනෑම අරාවකට මූලද්‍රව්‍යයක් සොයා ගැනීමට එයට බොහෝ ක්‍රම ඇති නමුත් සරලම ක්‍රමය වන්නේ 'in?' ක්‍රමය.

example:
arr = [1,2,3,4]
number = 1
puts "yes #{number} is present in arr" if number.in? arr

2
සටහන: මෙම පිළිතුරෙහි විස්තර කර ඇති පරිදි , ක්‍රමය ආනයනය කිරීම in?අවශ්‍ය වේ ActiveSupport: require active_support.
පැට්‍රික්

ඔබ මූලික දිගු භාවිතා කරන්නේ නම් එයට සියලු ActiveSupport අවශ්‍ය නොවේ .
ටින් මෑන්


0

යමක් කිරීමේ විවිධ ක්‍රමවල සාපේක්ෂ වේගය බැලීමට සමහර මිණුම් සලකුණු ධාවනය කිරීම මට සෑම විටම සිත්ගන්නා සුළුය.

ආරම්භයේ, මැද හෝ අවසානයේ අරාව මූලද්‍රව්‍යයක් සොයා ගැනීම ඕනෑම රේඛීය සෙවුමකට බලපාන නමුත් කට්ටලයකට එරෙහි සෙවුමකට යන්තම් බලපායි.

අරාව කට්ටලයක් බවට පරිවර්තනය කිරීම සැකසීමේ වේලාවට විශාල බලපෑමක් ඇති කරයි, එබැවින් එක් වරක් අරාවකින් කට්ටලය සාදන්න, නැතහොත් මුල සිටම කට්ටලයක් සමඟ ආරම්භ කරන්න.

මෙන්න මිණුම් දණ්ඩ කේතය:

# frozen_string_literal: true

require 'fruity'
require 'set'

ARRAY = (1..20_000).to_a
SET = ARRAY.to_set

DIVIDER = '-' * 20

def array_include?(elem)
  ARRAY.include?(elem)
end

def array_member?(elem)
  ARRAY.member?(elem)
end

def array_index(elem)
  ARRAY.index(elem) >= 0
end

def array_find_index(elem)
  ARRAY.find_index(elem) >= 0
end

def array_index_each(elem)
  ARRAY.index { |each| each == elem } >= 0
end

def array_find_index_each(elem)
  ARRAY.find_index { |each| each == elem } >= 0
end

def array_any_each(elem)
  ARRAY.any? { |each| each == elem }
end

def array_find_each(elem)
  ARRAY.find { |each| each == elem } != nil
end

def array_detect_each(elem)
  ARRAY.detect { |each| each == elem } != nil
end

def set_include?(elem)
  SET.include?(elem)
end

def set_member?(elem)
  SET.member?(elem)
end

puts format('Ruby v.%s', RUBY_VERSION)

{
  'First' => ARRAY.first,
  'Middle' => (ARRAY.size / 2).to_i,
  'Last' => ARRAY.last
}.each do |k, element|
  puts DIVIDER, k, DIVIDER

  compare do
    _array_include?        { array_include?(element)        }
    _array_member?         { array_member?(element)         }
    _array_index           { array_index(element)           }
    _array_find_index      { array_find_index(element)      }
    _array_index_each      { array_index_each(element)      }
    _array_find_index_each { array_find_index_each(element) }
    _array_any_each        { array_any_each(element)        }
    _array_find_each       { array_find_each(element)       }
    _array_detect_each     { array_detect_each(element)     }
  end
end

puts '', DIVIDER, 'Sets vs. Array.include?', DIVIDER
{
  'First' => ARRAY.first,
  'Middle' => (ARRAY.size / 2).to_i,
  'Last' => ARRAY.last
}.each do |k, element|
  puts DIVIDER, k, DIVIDER

  compare do
    _array_include? { array_include?(element) }
    _set_include?   { set_include?(element)   }
    _set_member?    { set_member?(element)    }
  end
end

මගේ මැක් ඕඑස් ලැප්ටොප් පරිගණකයේ ධාවනය වන විට එහි ප්‍රති results ලය වනුයේ:

Ruby v.2.7.0
--------------------
First
--------------------
Running each test 65536 times. Test will take about 5 seconds.
_array_include? is similar to _array_index
_array_index is similar to _array_find_index
_array_find_index is faster than _array_any_each by 2x ± 1.0
_array_any_each is similar to _array_index_each
_array_index_each is similar to _array_find_index_each
_array_find_index_each is faster than _array_member? by 4x ± 1.0
_array_member? is faster than _array_detect_each by 2x ± 1.0
_array_detect_each is similar to _array_find_each
--------------------
Middle
--------------------
Running each test 32 times. Test will take about 2 seconds.
_array_include? is similar to _array_find_index
_array_find_index is similar to _array_index
_array_index is faster than _array_member? by 2x ± 0.1
_array_member? is faster than _array_index_each by 2x ± 0.1
_array_index_each is similar to _array_find_index_each
_array_find_index_each is similar to _array_any_each
_array_any_each is faster than _array_detect_each by 30.000000000000004% ± 10.0%
_array_detect_each is similar to _array_find_each
--------------------
Last
--------------------
Running each test 16 times. Test will take about 2 seconds.
_array_include? is faster than _array_find_index by 10.000000000000009% ± 10.0%
_array_find_index is similar to _array_index
_array_index is faster than _array_member? by 3x ± 0.1
_array_member? is faster than _array_find_index_each by 2x ± 0.1
_array_find_index_each is similar to _array_index_each
_array_index_each is similar to _array_any_each
_array_any_each is faster than _array_detect_each by 30.000000000000004% ± 10.0%
_array_detect_each is similar to _array_find_each

--------------------
Sets vs. Array.include?
--------------------
--------------------
First
--------------------
Running each test 65536 times. Test will take about 1 second.
_array_include? is similar to _set_include?
_set_include? is similar to _set_member?
--------------------
Middle
--------------------
Running each test 65536 times. Test will take about 2 minutes.
_set_member? is similar to _set_include?
_set_include? is faster than _array_include? by 1400x ± 1000.0
--------------------
Last
--------------------
Running each test 65536 times. Test will take about 4 minutes.
_set_member? is similar to _set_include?
_set_include? is faster than _array_include? by 3000x ± 1000.0

මූලික වශයෙන් ප්‍රති results ල මට පවසන්නේ සෑම දෙයක්ම සඳහා කට්ටලයක් භාවිතා කරන ලෙසයි. මම ඇතුළත් කිරීම සෙවීමට යන්නේ නම් මිස පළමු අංගය මට අවශ්‍ය එක බව සහතික කළ නොහැකි නම් එය බොහෝ දුරට ඉඩ නැත. හෑෂ් එකකට මූලද්‍රව්‍ය ඇතුල් කිරීමේදී යම්කිසි පොදු කාර්යයක් ඇත, නමුත් සෙවුම් වේලාවන් ඉතා වේගවත් බැවින් එය කිසි විටෙකත් සලකා බැලිය යුතු යැයි මම නොසිතමි. නැවතත්, ඔබට එය සෙවීමට අවශ්‍ය නම්, අරාව භාවිතා නොකරන්න, කට්ටලයක් භාවිතා කරන්න. (හෝ හැෂ්.)

අරාව කුඩා වන තරමට අරා ක්‍රම ක්‍රියාත්මක වනු ඇත, නමුත් ඒවා තවමත් පවත්වා ගෙන යන්නේ නැත, කුඩා අරා වල වෙනස ඉතා කුඩා විය හැක.

"මුලින්ම", "මැද" සහ "පසුගිය" භාවිතය පිළිබිඹු first, size / 2සහ lastසඳහා ARRAYපැවැත්ම සඳහා සොයා එම මූලද්රව්යය සඳහා. ARRAYසහ SETවිචල්යයන් සෙවීමේදී එම මූලද්රව්යය භාවිතා වේ.

සංසන්දනය කරන ක්‍රම සඳහා සුළු වෙනස්කම් සිදු කරන > 0ලද්දේ පරීක්ෂණය වර්ග පරීක්ෂණ >= 0සඳහා විය යුතු බැවිනි index.

පලතුරු සහ එහි ක්‍රමවේදය පිළිබඳ වැඩි විස්තර එහි README හි ඇත.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.