require 'benchmark/ips' def find_one_using_group_by_select(array) array.group_by{ |e| e }.detect { |k, v| k if v.size > 1 }&.first end def find_one_using_chunk_select(array) array.sort.chunk{ |e| e }.detect { |e, chunk| chunk.size > 1 }&.first end def find_one_using_count_select(array) array.detect{ |e| array.count(e) > 1 } end 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 def find_all_using_group_by_select(array) array.group_by{ |e| e }.select { |k, v| k if v.size > 1 }.map &:first end def find_all_using_chunk_select(array) array.sort.chunk{ |e| e }.select { |e, chunk| chunk.size > 1 }.map &:first end def find_all_using_count_select(array) array.select{ |e| array.count(e) > 1 }.uniq end def find_all_using_hash_map(array) map = {} dup = [] array.each do |v| map[v] = (map[v] || 0 ) + 1 if map[v] == 2 dup << v end end return dup end num_array = Array.new(1000) { rand 1000 } char_array = Array.new(20) { (65 + rand(26)).chr } word_array = Array.new(1000) { Array.new(5) { (65 + rand(26)).chr }.join } Benchmark.ips do |x| puts "Find one uniq element from: Number array" x.report('Using group_by.select') do find_one_using_group_by_select(num_array) end x.report('Using sort.chunk.select') do find_one_using_chunk_select(num_array) end x.report('Using count select') do find_one_using_count_select(num_array) end x.report('Using hash map') do find_one_using_hash_map(num_array) end x.compare! end Benchmark.ips do |x| puts "Find one uniq element from: Character array" x.report('Using group_by.select') do find_one_using_group_by_select(char_array) end x.report('Using sort.chunk.select') do find_one_using_chunk_select(char_array) end x.report('Using count select') do find_one_using_count_select(char_array) end x.report('Using hash map') do find_one_using_hash_map(char_array) end x.compare! end Benchmark.ips do |x| puts "Find one uniq element from: Word array" x.report('Using group_by.select') do find_one_using_group_by_select(word_array) end x.report('Using sort.chunk.select') do find_one_using_chunk_select(word_array) end x.report('Using count select') do find_one_using_count_select(word_array) end x.report('Using hash map') do find_one_using_hash_map(word_array) end x.compare! end Benchmark.ips do |x| puts "Find all uniq elements from: Number array" x.report('Using group_by.select') do find_all_using_group_by_select(num_array) end x.report('Using sort.chunk.select') do find_all_using_chunk_select(num_array) end x.report('Using count select') do find_all_using_count_select(num_array) end x.report('Using hash map') do find_all_using_hash_map(num_array) end x.compare! end Benchmark.ips do |x| puts "Find all uniq elements from: Character array" x.report('Using group_by.select') do find_all_using_group_by_select(char_array) end x.report('Using sort.chunk.select') do find_all_using_chunk_select(char_array) end x.report('Using count select') do find_all_using_count_select(char_array) end x.report('Using hash map') do find_all_using_hash_map(char_array) end x.compare! end Benchmark.ips do |x| puts "Find all uniq elements from: Word array" x.report('Using group_by.select') do find_all_using_group_by_select(word_array) end x.report('Using sort.chunk.select') do find_all_using_chunk_select(word_array) end x.report('Using count select') do find_all_using_count_select(word_array) end x.report('Using hash map') do find_all_using_hash_map(word_array) end x.compare! end