অ্যারেতে সদৃশ মানটি কীভাবে সন্ধান এবং ফিরে পাওয়া যায়


170

arr স্ট্রিংয়ের অ্যারে:

["hello", "world", "stack", "overflow", "hello", "again"]

arrডুপ্লিকেট রয়েছে কিনা তা যাচাই করার সহজ ও মার্জিত উপায় কী হবে এবং যদি তা হয় তবে তাদের মধ্যে একটি ফেরত দিন (যাই হোক না কেন)

উদাহরণ:

["A", "B", "C", "B", "A"]    # => "A" or "B"
["A", "B", "C"]              # => nil

arr == arr.uniqarrসদৃশগুলি আছে কিনা তা যাচাই করার জন্য একটি সহজ এবং মার্জিত উপায় হতে পারে , তবে এটি সদৃশ ছিল যা সরবরাহ করে না।
জোয়েল আজমের

উত্তর:


249
a = ["A", "B", "C", "B", "A"]
a.detect{ |e| a.count(e) > 1 }

আমি জানি এটি খুব মার্জিত উত্তর নয়, তবে আমি এটি পছন্দ করি। এটি সুন্দর একটি লাইন কোড। আপনার বিশাল ডেটা সেট প্রক্রিয়া করার প্রয়োজন না হলে এবং পুরোপুরি সূক্ষ্মভাবে কাজ করে।

দ্রুত সমাধান খুঁজছেন? এই যে!

def find_one_using_hash_map(array)
  map = {}
  dup = nil
  array.each do |v|
    map[v] = (map[v] || 0 ) + 1

    if map[v] > 1
      dup = v
      break
    end
  end

  return dup
end

এটি লিনিয়ার, ও (এন), তবে এখন একাধিক লাইন অফ-কোড পরিচালনা করা দরকার, পরীক্ষার কেসগুলি ইত্যাদি দরকার needs

আপনার যদি আরও দ্রুত সমাধানের প্রয়োজন হয় তবে তার পরিবর্তে সি চেষ্টা করুন।

এবং এখানে বিভিন্ন সমাধানের সাথে তুলনা করার মূল বক্তব্যটি রয়েছে: https://gist.github.com/naveed-ahmad/8f0b926ffccf5fbd206a1cc58ce9743e


59
রৈখিক সময়ে সমাধান করা যায় এমন কোনও কিছুর জন্য চতুর্ভুজ ব্যতীত।
jasonmp85

18
রৈখিক সমস্যার জন্য ও (এন ^ 2) সমাধান সরবরাহ করা কোনও উপায় নয়।
tdgs

21
@ জেসনম্প 85 - সত্য; তবে এটি কেবল বিগ-ও রানটাইম বিবেচনা করে। অনুশীলনে, আপনি যদি কিছু বিশাল স্কেলিং ডেটার জন্য এই কোডটি না লিখে থাকেন (এবং যদি থাকে তবে আপনি আসলে কেবল সি বা পাইথন ব্যবহার করতে পারেন), প্রদত্ত উত্তরটি আরও বেশি মার্জিত / পঠনযোগ্য এবং 'তুলনায় অনেক ধীর গতিতে চলবে না' compared একটি লিনিয়ার সময় সমাধান। তত্ত্বীয়ভাবে, তাত্ত্বিক ক্ষেত্রে, লিনিয়ার সময় সমাধানের জন্য রৈখিক স্থান প্রয়োজন, যা উপলভ্য নাও হতে পারে
ডেভিড টি।

26
@ কালানামিথ আপনি এটি ব্যবহার করে সদৃশ মান পেতে পারেনa.select {|e| a.count(e) > 1}.uniq
নাভিদ

26
"সনাক্তকরণ" পদ্ধতির সমস্যাটি হ'ল এটি যখন প্রথম নকলটি খুঁজে পায় তখন এটি থেমে যায় এবং আপনাকে সমস্ত ডুপস দেয় না।
জাইম বেল্মায়ার

214

প্রথম বিকল্পটি দ্রুততম সহ আপনি কয়েকটি উপায়ে এটি করতে পারেন:

ary = ["A", "B", "C", "B", "A"]

ary.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)

ary.sort.chunk{ |e| e }.select { |e, chunk| chunk.size > 1 }.map(&:first)

এবং একটি ও (এন ^ 2) বিকল্প (যেমন কম দক্ষ):

ary.select{ |e| ary.count(e) > 1 }.uniq

17
প্রথম দুটি বড় অ্যারেগুলির জন্য আরও বেশি দক্ষ। শেষটি হ'ল ও (এন * এন) এটি ধীর হয়ে যেতে পারে। আমার এটি 20k elements এলিমেন্টের সাথে অ্যারের জন্য ব্যবহার করার দরকার ছিল এবং প্রথম দুটি প্রায় তত্ক্ষণাত্ ফিরে আসে। আমাকে তৃতীয়টি বাতিল করতে হয়েছিল কারণ এটি এত দিন নিচ্ছিল। ধন্যবাদ !!
ভেঙ্কট ডি

5
কেবলমাত্র একটি পর্যবেক্ষণ তবে .map (&: প্রথম) দিয়ে শেষ হওয়া প্রথম দুটিটি .Kys দিয়ে শেষ হতে পারে কারণ সেই অংশটি কেবল একটি হ্যাশের কীগুলি টানছে।
ইঞ্জিনিয়ার

@ ইঞ্জিনিয়ার ডেভ যা রুবি সংস্করণ ব্যবহৃত হচ্ছে তার উপর নির্ভর করে। 1.8.7 এর জন্য প্রয়োজন: প্রথম বা এমনকি {| কে, _ | অ্যাক্টিভসপোর্ট ব্যতীত k}
আমিরিকোল

এখানে কয়েকটি মানদণ্ড gist.github.com/equivalent/3c9a4c9d07fff79062a3 পারফরম্যান্সে বিজয়ী স্পষ্ট group_by.select
সমতুল্য 8

6
আপনি রুবি> 2.1 ব্যবহার করেন, তাহলে আপনি ব্যবহার করতে পারেন: ary.group_by(&:itself)। :-)
ড্রেনমি

44

কেবল প্রথম উদাহরণটি সন্ধান করুন যেখানে বস্তুর সূচক (বাম থেকে গণনা) বস্তুর সূচকের সমান হয় না (ডান থেকে গণনা)।

arr.detect {|e| arr.rindex(e) != arr.index(e) }

যদি কোনও সদৃশ না থাকে তবে ফেরতের মান শূন্য হবে।

আমি বিশ্বাস করি এটি থ্রেডে এখন পর্যন্ত পোস্ট করা সবচেয়ে দ্রুত সমাধান, পাশাপাশি এটি অতিরিক্ত বস্তু তৈরির উপর নির্ভর করে না #indexএবং #rindexএটি সিটিতে প্রয়োগ করা হয়েছে বিগ-ও রানটাইমটি এন ^ 2 এবং এর চেয়ে ধীর সার্জিও'র, তবে "ধীর" অংশগুলি সি-তে চালিত হওয়ার কারণে প্রাচীরের সময়টি আরও দ্রুত হতে পারে could


5
আমি এই সমাধানটি পছন্দ করি তবে এটি কেবল প্রথম সদৃশটিই ফিরে আসবে। সমস্ত অনুলিপি সন্ধান করতে:arr.find_all {|e| arr.rindex(e) != arr.index(e) }.uniq
জোশ

1
অথবা আপনার উত্তরটি দেখায় যে কীভাবে কোনও ত্রিভুজ রয়েছে কিনা, বা অ্যারে থেকে "CAT" বানান করার জন্য উপাদানগুলি আঁকতে পারে কিনা তা কীভাবে খুঁজে পাওয়া যায়।
ক্যারি সোভোল্যান্ড

3
@ bruno077 এই লিনিয়ার সময়টি কেমন?
beauby

4
গ্রেট উত্তর @chris, কিন্তু আমি মনে করি আপনি একটি বিট এই সঙ্গে আরো ভালো করতে পারেন: arr.detect.with_index { |e, idx| idx != arr.rindex(e) }। ব্যবহারের with_indexফলে প্রথম indexঅনুসন্ধানের প্রয়োজনীয়তা অপসারণ করা উচিত ।
ki4jnq

কলামে সদৃশদের তুলনা করে আপনি কীভাবে এটি 2 ডি অ্যারের সাথে মানিয়ে নেবেন?
আহনিবিজ্যাকড

30

detectকেবল একটি সদৃশ খুঁজে পাওয়া যায়। find_allতাদের সব খুঁজে পাবেন:

a = ["A", "B", "C", "B", "A"]
a.find_all { |e| a.count(e) > 1 }

3
প্রশ্নটি অত্যন্ত সুনির্দিষ্ট যে কেবল একটি অনুলিপি ফেরত আসতে হবে। ইমো, সমস্ত ডুপ্লিকেটগুলি কীভাবে সন্ধান করতে হবে তা দেখানো ঠিক আছে, তবে কেবল উত্তর হিসাবে কোনও প্রশ্নের উত্তর জিজ্ঞাসা করেছে, যা আপনি করেননি। বিটিডব্লিউ, countঅ্যারের প্রতিটি উপাদানগুলির জন্য প্রার্থনা করা এটি বেদনাদায়কভাবে অক্ষম । যেমন, গঠন করা; (একটি কাউন্টিং হ্যাশ, উদাহরণস্বরূপ, আরো অনেক কিছু কার্যকরী h = {"A"=>2, "B"=>2, "C"=> 1 }তারপর h.select { |k,v| v > 1 }.keys #=> ["A", "B"]
: Cary Swoveland

24

এখানে সদৃশ সন্ধানের আরও দুটি উপায়।

একটি সেট ব্যবহার করুন

require 'set'

def find_a_dup_using_set(arr)
  s = Set.new
  arr.find { |e| !s.add?(e) }
end

find_a_dup_using_set arr
  #=> "hello" 

সমস্ত সদৃশ একটি অ্যারের ফিরে পেতে selectজায়গায় ব্যবহার করুন find

ব্যবহার Array#difference

class Array
  def difference(other)
    h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
    reject { |e| h[e] > 0 && h[e] -= 1 }
  end
end

def find_a_dup_using_difference(arr)
  arr.difference(arr.uniq).first
end

find_a_dup_using_difference arr
  #=> "hello" 

.firstসমস্ত অনুলিপিগুলির একটি অ্যারে ফেরত দিতে ড্রপ করুন ।

nilকোনও সদৃশ না থাকলে উভয় পদ্ধতিই ফিরে আসে ।

আমি প্রস্তাব করেছি যেArray#difference রুবি কোর যুক্ত করা হবে। আরও তথ্য এখানে আমার উত্তর হয়

মাপকাঠি

আসুন প্রস্তাবিত পদ্ধতিগুলি তুলনা করি। প্রথমত, পরীক্ষার জন্য আমাদের একটি অ্যারে প্রয়োজন:

CAPS = ('AAA'..'ZZZ').to_a.first(10_000)
def test_array(nelements, ndups)
  arr = CAPS[0, nelements-ndups]
  arr = arr.concat(arr[0,ndups]).shuffle
end

এবং বিভিন্ন পরীক্ষার অ্যারেগুলির জন্য মাপদণ্ড চালানোর একটি পদ্ধতি:

require 'fruity'

def benchmark(nelements, ndups)
  arr = test_array nelements, ndups
  puts "\n#{ndups} duplicates\n"    
  compare(
    Naveed:    -> {arr.detect{|e| arr.count(e) > 1}},
    Sergio:    -> {(arr.inject(Hash.new(0)) {|h,e| h[e] += 1; h}.find {|k,v| v > 1} ||
                     [nil]).first },
    Ryan:      -> {(arr.group_by{|e| e}.find {|k,v| v.size > 1} ||
                     [nil]).first},
    Chris:     -> {arr.detect {|e| arr.rindex(e) != arr.index(e)} },
    Cary_set:  -> {find_a_dup_using_set(arr)},
    Cary_diff: -> {find_a_dup_using_difference(arr)}
  )
end

আমি @ জেজেপির উত্তরটি অন্তর্ভুক্ত করি নি কারণ কেবলমাত্র একটি সদৃশ ফিরতে হবে এবং যখন তার উত্তরটি পরিবর্তন করতে হবে এটি @ নাভিদের আগের উত্তর হিসাবে একই same আমি @ মারিনের উত্তরও অন্তর্ভুক্ত করিনি, যা @ নাভিদের উত্তরের আগে পোস্ট করা হয়েছিল, কেবলমাত্র একটির চেয়ে সমস্ত নকলই ফেরত দিয়েছিল (একটি ছোট বিষয় তবে উভয়কেই মূল্যায়ন করার মতো কোনও বিষয় নেই, কারণ কেবলমাত্র একটি সদৃশ ফেরত দেওয়ার সময় তারা অভিন্ন)।

আমি অন্যান্য উত্তরগুলিও সংশোধন করেছিলাম যা পাওয়া গেছে কেবলমাত্র প্রথমটি পাওয়া যায় এবং ফিরে আসার জন্য সমস্ত অনুলিপি ফিরে এসেছিল, তবে এটির মূলত কোনও কার্যকারিতার উপর কোনও প্রভাব ফেলতে হবে না, কারণ তারা একটি নির্বাচন করার আগে সমস্ত নকলকে গণনা করেছিল।

প্রতিটি বেঞ্চমার্কের ফলাফলগুলি দ্রুত থেকে ধীরতম পর্যন্ত তালিকাভুক্ত করা হয়:

প্রথম ধরুন অ্যারেতে 100 টি উপাদান রয়েছে:

benchmark(100, 0)
0 duplicates
Running each test 64 times. Test will take about 2 seconds.
Cary_set is similar to Cary_diff
Cary_diff is similar to Ryan
Ryan is similar to Sergio
Sergio is faster than Chris by 4x ± 1.0
Chris is faster than Naveed by 2x ± 1.0

benchmark(100, 1)
1 duplicates
Running each test 128 times. Test will take about 2 seconds.
Cary_set is similar to Cary_diff
Cary_diff is faster than Ryan by 2x ± 1.0
Ryan is similar to Sergio
Sergio is faster than Chris by 2x ± 1.0
Chris is faster than Naveed by 2x ± 1.0

benchmark(100, 10)
10 duplicates
Running each test 1024 times. Test will take about 3 seconds.
Chris is faster than Naveed by 2x ± 1.0
Naveed is faster than Cary_diff by 2x ± 1.0 (results differ: AAC vs AAF)
Cary_diff is similar to Cary_set
Cary_set is faster than Sergio by 3x ± 1.0 (results differ: AAF vs AAC)
Sergio is similar to Ryan

10,000 টি উপাদান সহ একটি অ্যারে বিবেচনা করুন:

benchmark(10000, 0)
0 duplicates
Running each test once. Test will take about 4 minutes.
Ryan is similar to Sergio
Sergio is similar to Cary_set
Cary_set is similar to Cary_diff
Cary_diff is faster than Chris by 400x ± 100.0
Chris is faster than Naveed by 3x ± 0.1

benchmark(10000, 1)
1 duplicates
Running each test once. Test will take about 1 second.
Cary_set is similar to Cary_diff
Cary_diff is similar to Sergio
Sergio is similar to Ryan
Ryan is faster than Chris by 2x ± 1.0
Chris is faster than Naveed by 2x ± 1.0

benchmark(10000, 10)
10 duplicates
Running each test once. Test will take about 11 seconds.
Cary_set is similar to Cary_diff
Cary_diff is faster than Sergio by 3x ± 1.0 (results differ: AAE vs AAA)
Sergio is similar to Ryan
Ryan is faster than Chris by 20x ± 10.0
Chris is faster than Naveed by 3x ± 1.0

benchmark(10000, 100)
100 duplicates
Cary_set is similar to Cary_diff
Cary_diff is faster than Sergio by 11x ± 10.0 (results differ: ADG vs ACL)
Sergio is similar to Ryan
Ryan is similar to Chris
Chris is faster than Naveed by 3x ± 1.0

দ্রষ্টব্য যে সি তে প্রয়োগ করা find_a_dup_using_difference(arr)হলে আরও কার্যকর Array#differenceহবে, এটি রুবি কোরকে যুক্ত করা হলে এমন হবে।

উপসংহার

উত্তরগুলির অনেকগুলি যুক্তিসঙ্গত তবে একটি সেট ব্যবহার করা স্পষ্ট সেরা পছন্দ । এটি মাঝারি-হার্ড ক্ষেত্রে সবচেয়ে দ্রুত, সবচেয়ে কঠিন মধ্যে যৌথ দ্রুত এবং কেবল গণনামূলকভাবে তুচ্ছ ক্ষেত্রে - যখন আপনার পছন্দটি কোনওভাবেই গুরুত্ব দেয় না - এটি মারধর করা যেতে পারে।

আপনি ক্রিসের সমাধানটি বেছে নিতে পারেন তার মধ্যে একটি বিশেষ ক্ষেত্রে হ'ল আপনি যদি হাজার হাজার ছোট অ্যারে আলাদাভাবে ডি-নকল করতে পদ্ধতিটি ব্যবহার করতে চান এবং 10 টিরও কম আইটেম খুব সহজেই খুঁজে পাবেন This এটি কিছুটা দ্রুত হবে This এটি সেট তৈরির ক্ষেত্রে অতিরিক্ত অতিরিক্ত ওভারহেড এড়িয়ে চলে।


1
দুর্দান্ত সমাধান। এটি প্রথমে কয়েকটি পদ্ধতির হিসাবে কী চলছে তা একেবারেই সুস্পষ্ট নয় তবে এটি কিছুটা মেমরির ব্যয়ে সত্যিকারের রৈখিক সময়ে চালানো উচিত।
ক্রিস হিল্ড

সন্ধান_এ_ডুপ_ইজিং_সেটের সাহায্যে আমি সদৃশগুলির একটির পরিবর্তে সেটটি ফিরে পেয়েছি। এছাড়াও আমি রুবি ডক্সে "find.with_object" খুঁজে পাচ্ছি না।
স্কটজে

@ স্কটজ, ধরার জন্য ধন্যবাদ! এটি আকর্ষণীয় যে এখনকার আগে কেউ এটি ধরেনি। আমি এটা ঠিক করেছি. এটা গণনীয় # খুঁজে শৃঙ্খলিত গণনাকারী # with_object । আমি আপনার সমাধান এবং অন্যদের যুক্ত করে মানদণ্ডগুলি আপডেট করব।
কেরি সোভোল্যান্ড

1
দুর্দান্ত তুলনা @ ক্যারি সোভোল্যান্ড
নাভিদ ২

19

হায় হ'ল বেশিরভাগ উত্তর O(n^2)

এখানে একটি O(n)সমাধান,

a = %w{the quick brown fox jumps over the lazy dog}
h = Hash.new(0)
a.find { |each| (h[each] += 1) == 2 } # => 'the"

এর জটিলতা কী?

  • রান O(n)এবং প্রথম ম্যাচে বিরতি
  • O(n)মেমরি ব্যবহার করে তবে কম পরিমাণে

এখন, আপনার অ্যারেতে ঘন ঘন অনুলিপিগুলি নির্ভর করে এই রানটাইমগুলি আসলে আরও ভাল হয়ে উঠতে পারে। উদাহরণস্বরূপ, যদি আকারের অ্যারেটি বিভিন্ন উপাদানের O(n)জনসংখ্যা থেকে নমুনা তৈরি করা হয় k << nকেবল রানটাইম এবং স্পেস উভয়েরই জটিলতা হয়ে যায় O(k)তবে মূল পোস্টারটি ইনপুটকে বৈধতা দিচ্ছে এবং কোনও নকল নেই তা নিশ্চিত করতে চায়। O(n)সেক্ষেত্রে রানটাইম এবং মেমরি উভয় জটিলতা যেহেতু আমরা আশা করি উপাদানগুলির সংখ্যাগরিষ্ঠ ইনপুটগুলির জন্য কোনও পুনরাবৃত্তি না থাকে।


15

রুবি অ্যারে অবজেক্টগুলির একটি দুর্দান্ত পদ্ধতি রয়েছে select,।

select {|item| block }  new_ary
select  an_enumerator

প্রথম ফর্মটি এখানে আপনার আগ্রহী। এটি আপনাকে এমন একটি বস্তু নির্বাচন করতে দেয় যা পরীক্ষায় উত্তীর্ণ হয়।

রুবি অ্যারে অবজেক্টগুলির অন্য একটি পদ্ধতি রয়েছে count,।

count  int
count(obj)  int
count { |item| block }  int

এই ক্ষেত্রে, আপনি ডুপ্লিকেটগুলিতে আগ্রহী (বস্তুগুলি যা অ্যারেতে একাধিকবার প্রদর্শিত হবে)। উপযুক্ত পরীক্ষা হয় a.count(obj) > 1

যদি a = ["A", "B", "C", "B", "A"], তবে

a.select{|item| a.count(item) > 1}.uniq
=> ["A", "B"]

আপনি উল্লেখ করেছেন যে আপনি কেবল একটি জিনিস চান । সুতরাং একটি বাছাই।


1
আমি এটিকে অনেক পছন্দ করি, তবে আপনাকে শেষে ["A", "B", "B", "A"]
ইউনিক

1
দুর্দান্ত উত্তর। আমি ঠিক এটিই খুঁজছিলাম। যেমনটি @ জোয়েজয়েজোয়েজার দেখিয়েছেন। .uniqঅ্যারে রাখার জন্য আমি একটি সম্পাদনা জমা দিয়েছি ।
সূর্য

এটি বিশালভাবে অদক্ষ। আপনি কেবলমাত্র সমস্ত অনুলিপি সন্ধান করেন না এবং তারপরে একটি ব্যতীত সমস্তগুলি ফেলে দিন, আপনি countঅ্যারের প্রতিটি উপাদানটির জন্য অনুরোধ করেন যা অপব্যয় এবং অপ্রয়োজনীয়। জেজেপির উত্তরে আমার মন্তব্য দেখুন।
কেরি সোভোল্যান্ড

মানদণ্ড চালানোর জন্য ধন্যবাদ। চলমান সময়ের মধ্যে বিভিন্ন সমাধানগুলি কীভাবে তুলনা করে তা দেখতে দরকারী। মার্জিত উত্তরগুলি পঠনযোগ্য তবে প্রায়শই সবচেয়ে দক্ষ হয় না।
মার্টিন ভেলিজ

9

Find_all ()array সমস্ত উপাদান যুক্ত এমন একটি উপাদান প্রদান enumকরে যার জন্য blockএটি নয় false

duplicateউপাদান পেতে

>> arr = ["A", "B", "C", "B", "A"]
>> arr.find_all { |x| arr.count(x) > 1 }

=> ["A", "B", "B", "A"]

বা সদৃশ uniqউপাদানসমূহ

>> arr.find_all { |x| arr.count(x) > 1 }.uniq
=> ["A", "B"] 

7

এরকম কিছু কাজ করবে

arr = ["A", "B", "C", "B", "A"]
arr.inject(Hash.new(0)) { |h,e| h[e] += 1; h }.
    select { |k,v| v > 1 }.
    collect { |x| x.first }

এটি হ্যাশে সমস্ত মান রাখুন যেখানে কীটি অ্যারের উপাদান এবং মান হ'ল সংখ্যার উপস্থিতি। তারপরে একাধিকবার উপস্থিত সমস্ত উপাদান নির্বাচন করুন। সহজ।


7

আমি জানি যে এই থ্রেডটি বিশেষত রুবির সম্পর্কে, তবে আমি কীভাবে এটি অ্যাক্টিভেকর্ডের সাথে রিলে অন প্রসঙ্গে রেখেছি এবং কীভাবে আমার সমাধানটি ভাগ করে নেব তা ভেবে আমি এখানে অবতরণ করেছি।

class ActiveRecordClass < ActiveRecord::Base
  #has two columns, a primary key (id) and an email_address (string)
end

ActiveRecordClass.group(:email_address).having("count(*) > 1").count.keys

উপরেরটি সমস্ত ইমেল ঠিকানাগুলির একটি অ্যারে প্রদান করে যা এই উদাহরণের ডাটাবেস সারণীতে নকল করা আছে (যা রেলের মধ্যে "সক্রিয়_আরেকর্ড_ক্ল্যাশস" হবে)।


6
a = ["A", "B", "C", "B", "A"]
a.each_with_object(Hash.new(0)) {|i,hash| hash[i] += 1}.select{|_, count| count > 1}.keys

এটি একটি O(n)পদ্ধতি।

বিকল্পভাবে আপনি নিম্নলিখিত লাইন দুটি করতে পারেন। এছাড়াও ও (এন) তবে কেবল একটি পুনরাবৃত্তি

a.each_with_object(Hash.new(0).merge dup: []){|x,h| h[:dup] << x if (h[x] += 1) == 2}[:dup]

a.inject(Hash.new(0).merge dup: []){|h,x| h[:dup] << x if (h[x] += 1) == 2;h}[:dup]

2

এখানে আমার বড় অঙ্কের ডেটা গ্রহণ করা - যেমন সদৃশ অংশগুলি খুঁজে পাওয়ার জন্য কোনও উত্তরাধিকারী ডিবেস টেবিল

# Assuming ps is an array of 20000 part numbers & we want to find duplicates
# actually had to it recently.
# having a result hash with part number and number of times part is 
# duplicated is much more convenient in the real world application
# Takes about 6  seconds to run on my data set
# - not too bad for an export script handling 20000 parts

h = {};

# or for readability

h = {} # result hash
ps.select{ |e| 
  ct = ps.count(e) 
  h[e] = ct if ct > 1
}; nil # so that the huge result of select doesn't print in the console


1

each_with_object তোমার বন্ধু!

input = [:bla,:blubb,:bleh,:bla,:bleh,:bla,:blubb,:brrr]

# to get the counts of the elements in the array:
> input.each_with_object({}){|x,h| h[x] ||= 0; h[x] += 1}
=> {:bla=>3, :blubb=>2, :bleh=>2, :brrr=>1}

# to get only the counts of the non-unique elements in the array:
> input.each_with_object({}){|x,h| h[x] ||= 0; h[x] += 1}.reject{|k,v| v < 2}
=> {:bla=>3, :blubb=>2, :bleh=>2}

1

এই কোডটি সদৃশ মানগুলির তালিকা ফিরিয়ে দেবে। হ্যাশ কীগুলি কোন মানগুলি ইতিমধ্যে দেখা গেছে তা যাচাই করার কার্যকর উপায় হিসাবে ব্যবহৃত হয়। মানটি দেখা গেছে কিনা তার উপর ভিত্তি করে, মূল অ্যারেটি ary2 অ্যারেতে বিভক্ত করা হয়েছে: প্রথমে অনন্য মান রয়েছে এবং দ্বিতীয়টি সদৃশ রয়েছে।

ary = ["hello", "world", "stack", "overflow", "hello", "again"]

hash={}
arr.partition { |v| hash.has_key?(v) ? false : hash[v]=0 }.last.uniq

=> ["hello"]

এই ফর্মটি - আপনি আরও জটিল জটিল বাক্য নির্ধারণ করেও - এটি আরও সংক্ষিপ্ত করে তুলতে পারেন:

hash={}
arr.partition { |v| !hash.has_key?(v) && hash[v]=0 }.last.uniq


0

আপনি যদি দুটি ভিন্ন অ্যারে তুলনা করে থাকেন (নিজের বিপরীতে একের পরিবর্তে) খুব দ্রুত উপায় হ'ল রুবির অ্যারে শ্রেণীর& সরবরাহিত ছেদযুক্ত অপারেটরটি ব্যবহার করা ।

# Given
a = ['a', 'b', 'c', 'd']
b = ['e', 'f', 'c', 'd']

# Then this...
a & b # => ['c', 'd']

1
এটি উভয় অ্যারেতে থাকা আইটেমগুলি সন্ধান করে, একটি অ্যারেতে সদৃশ নয়।
কিম্মো লেহটো

যে ইশারা জন্য ধন্যবাদ। আমি আমার উত্তরে শব্দ পরিবর্তন করেছি। আমি এটি এখানে রেখে দেব কারণ এটি অনুসন্ধান থেকে আগত কিছু লোকের জন্য ইতিমধ্যে সহায়ক হিসাবে প্রমাণিত।
IAmNaN

0

আমার কয়টি সদৃশ ছিল এবং সেগুলি কী ছিল তা খুঁজে বের করার দরকার ছিলাম, তাই নাভিদ এর আগে যা পোস্ট করেছিল তার থেকে আমি একটি ফাংশন বিল্ডিং লিখেছিলাম:

def print_duplicates(array)
  puts "Array count: #{array.count}"
  map = {}
  total_dups = 0
  array.each do |v|
    map[v] = (map[v] || 0 ) + 1
  end

  map.each do |k, v|
    if v != 1
      puts "#{k} appears #{v} times"
      total_dups += 1
    end
  end
  puts "Total items that are duplicated: #{total_dups}"
end

-1
  1. আসুন সদৃশ পদ্ধতি তৈরি করুন যা উপাদানগুলির অ্যারেটিকে ইনপুট হিসাবে গ্রহণ করে
  2. পদ্ধতির মূল অংশে 2 টি নতুন অ্যারে অবজেক্ট তৈরি করা যাক যার মধ্যে একটি দেখা যায় এবং অন্যটি সদৃশ হয় d
  3. অবশেষে প্রদত্ত অ্যারেতে প্রতিটি অবজেক্টের মাধ্যমে পুনরাবৃত্তি করতে দেয় এবং প্রতিটি পুনরাবৃত্তির জন্য সেই বস্তুর দেখা অ্যারেতে উপস্থিত থাকতে দেয়।
  4. যদি দেখানো অ্যারেতে বস্তুটির অস্তিত্ব থাকে, তবে এটি সদৃশ অবজেক্ট হিসাবে বিবেচিত হবে এবং সেই বস্তুকে নকল_আররে ধাক্কা দেবে
  5. যদি বস্তুর উপস্থিতিতে অস্তিত্ব থাকে না, তবে এটি অনন্য বস্তু হিসাবে বিবেচিত হবে এবং সেই বস্তুকে দেখে_রেতে ধাক্কা দেবে

কোড প্রয়োগে প্রদর্শিত হবে

def duplication given_array
  seen_objects = []
  duplication_objects = []

  given_array.each do |element|
    duplication_objects << element if seen_objects.include?(element)
    seen_objects << element
  end

  duplication_objects
end

এখন ডুপ্লিকেশন পদ্ধতি এবং আউটপুট রিটার্ন ফলাফল কল করুন -

dup_elements = duplication [1,2,3,4,4,5,6,6]
puts dup_elements.inspect

কোড-কেবলমাত্র উত্তরগুলি সাধারণত এই সাইটে ভ্রান্ত হয়। আপনার কোডটির কিছু মন্তব্য বা ব্যাখ্যা অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করতে পারেন? ব্যাখ্যাগুলির মতো প্রশ্নের উত্তর দেওয়া উচিত: এটি কী করে? কিভাবে এটা কাজ করে? কোথায় যায়? এটি কীভাবে ওপির সমস্যা সমাধান করবে? দেখুন: কিভাবে নতুনকরণ করবেন । ধন্যবাদ!
এডুয়ার্ডো বাইটেলো

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.