Как изменить массив массивов в hashmap? - PullRequest
0 голосов
/ 27 сентября 2019

Я застрял в ситуации, у меня есть массив массива структуры, как я могу сделать его хэш, как показано ниже: -

Пример:

[[378, 1], [144, 1], [144, 1], [144, 3], [144, 7], [144, 6], [144, 8], [144, 8], [809, 1], [809, 1], [809, 8]]  

Преобразовать в:

{378=>[1], 144=>[1,3,7,6,8], 809=>[1,8]}

означает, что первый элемент взят в качестве ключа, а второй элемент другого массива - в качестве значения, соответствующего ключу.

Я пробовал метод ниже, но не смогв одном случае использования:

raw_hash = arr.group_by { |sub_arr| sub_arr[0] }
modified_hash = {}
raw_hash.each do |k, arr|
   modified_hash[k] = [ arr.flatten.uniq - [ k ] ].flatten
end

неудачный вариант использования, если первый элемент и второй элемент оба будут одинаковыми, тогда он получит уникальное значение и вычтет второе значение

Ответы [ 2 ]

4 голосов
/ 27 сентября 2019

Просто используйте each_with_object, это быстрее и потребляет меньше памяти, чем подход @ mrzasa:

array.each_with_object(Hash.new { |h, k| h[k] = [] }) do |(first, last), m|  
  m[first] |= [last]
end
#=> {378=>[1], 144=>[1, 3, 7, 6, 8], 809=>[1, 8]}

Но для уникальности самый простой, вероятно, будет использовать Set:

array.each_with_object(Hash.new { |h, k| h[k] = Set.new }) do |(first, last), m|  
  m[first] << last 
end
#=> {378=>#<Set: {1}>, 144=>#<Set: {1, 3, 7, 6, 8}>, 809=>#<Set: {1, 8}>}
3 голосов
/ 27 сентября 2019

Сгруппируйте по первому элементу массива и затем выберите последние вторые элементы сгруппированных значений.

a = [[378, 1], [144, 1], [144, 1], [144, 3], [144, 7], [144, 6], [144, 8], [144, 8], [809, 1], [809, 1], [809, 8]] 
a.group_by(&:first).map{|k, v| [k, v.map(&:last)]}.to_h
# => {378=>[1], 144=>[1, 1, 3, 7, 6, 8, 8], 809=>[1, 1, 8]}

РЕДАКТИРОВАТЬ:

Если вы хотите иметь уникальные значения, добавьтеuniq к карте, которая их собирает:

a.group_by(&:first).map{|k, v| [k, v.map(&:last).uniq]}.to_h
#=> {378=>[1], 144=>[1, 3, 7, 6, 8], 809=>[1, 8]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...