Учитывая этот массив массивов, как мне подсчитать количество массивов, которые содержат дублирующий элемент внутри себя? - PullRequest
0 голосов
/ 20 января 2020

У меня есть массив, который выглядит следующим образом:

[[["Sports", "Soccer"], 2], [["eSports"], 1], [["Sports", "Soccer"], 3]]

В любом элементе самого внешнего массива первый элемент (массив) - это список категорий. Второй элемент - это program.id, из которого получен этот массив категорий.

Итак, первый элемент в указанном выше массиве - ["Sports", "Soccer"] - это массив категорий для program_id: 2.

* 1010. * Как мне считать экземпляры дубликатов массива категорий? В приведенном выше случае, я хочу что-то вроде этого:
["Sports", "Soccer"] => Occurs 2 times, with Program Ids: 2 & 3
["eSports"] => Occurs 1 time, with Program Id: 1

Как мне сделать это эффективно?

Ответы [ 2 ]

5 голосов
/ 20 января 2020
grouped = array.group_by { |s, id| s }.transform_values { |v| v.map(&:last) }

=> { ["Sports", "Soccer"] => [2, 3], 
     ["eSports"]          => [1] }

Для использования:

grouped.each { |k,v| 
  puts "[#{k.join(', ')}] occurs #{v.length} time(s) with ID: #{v.join(' and ')}" 
}

[Sports, Soccer] occurs 2 time(s) with ID: 2 and 3
[eSports] occurs 1 time(s) with ID: 1
3 голосов
/ 20 января 2020

Как насчет этого?

arr = [[["Sports", "Soccer"], 2], [["eSports"], 1], [["Sports", "Soccer"], 3]]
count = {}
arr.each do |el|
  count[el[0]] ||= []
  count[el[0]] << el[1]
end

count.each do |category, ids|
  puts "#{category} occurs #{ids.count} times, with Program Ids: #{ids.join(' & ')}"
end

вывод

["Sports", "Soccer"] occurs 2 times, with Program Ids: 2 & 3
["eSports"] occurs 1 times, with Program Ids: 1
...