Как создать ожидаемый результат, используя метод split, используемый в моем коде? - PullRequest
0 голосов
/ 08 июля 2019

Вопрос:

Создайте метод для массива, который возвращает хеш с ключом в качестве длины элемента и значением в виде массива всех элементов этой длины.Используйте Array#each.

Возвращенный хэш должен быть отсортирован по ключу.

Я попытался сделать это с помощью сортировки хэша по длине.Я почти решил это, используя другой метод, но я хочу использовать split и hash для достижения ожидаемого результата.

Может кто-нибудь предложить какие-либо изменения в моем коде ниже?

Входной аргумент:

array-hash.rb "['abc','def',1234,234,'abcd','x','mnop',5,'zZzZ']"

Ожидаемый результат:

{1=>["x", "5"], 3=>["abc", "def", "234"], 4=>["1234", "abcd", "mnop", "zZzZ"]}
class String
  def key_length(v2)
    hash = {}
    v2.each do |item|
      item_length = item.to_s.length
      hash[item_length] ||= []
      hash[item_length].push(item)
    end
    Hash[hash.sort]
  end
end

reader = ''
if ARGV.empty?
  puts 'Please provide an input'
else
  v1 = ARGV[0]
  v2 = v1.tr("'[]''",'').split
  p reader.key_length(v2)
end

Фактический результат:

{35=>["abc,def,1234,234,abcd,x,mnop,5,zZzZ"]}

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Учитывая массив (преобразованный из строки, запишите целые числа как строку между ""):

ary = str[1..-2].delete('\'').split(',')
ary #=> ["abc", "def", "1234", "234", "abcd", "x", "mnop", "5", "zZzZ"]

Наиболее «идиоматическим» способом должно быть использование group_by:

ary.group_by(&:size)

Если вы хотите использовать каждый из них, то вы можете использовать Enumerable # each_with_object , где объектом является Hash # new с пустым массивом по умолчанию:

ary.each_with_object(Hash.new{ |h,k| h[k] = []}) { |e, h| h[e.size] << e }

Что совпадает с

res = Hash.new{ |h,k| h[k] = []}
ary.each { |e| res[e.size] << e }
0 голосов
/ 08 июля 2019

Не уверен, зачем вам нужен массив monkeypatch *, это школьное упражнение или что-то еще?

Я думаю, что ваша ошибка в том, что вам нужно ввести аргумент-разделитель для разделения.

Я бы сам решил основную проблему как вещь уменьшения / введения / сгиба.

s = "['abc','def',1234,234,'abcd','x','mnop',5,'zZzZ']"
splits = s.tr("'[]''",'').split(',') # need to pass in the comma for the split
Hash[splits.inject({}) { |memo,s| memo[s.length] ||= []; memo[s.length] << s; memo }.sort] # doesn't use Array.each but?

{1 => ["x", "5"], 3 => ["def", "234"], 4 => ["1234", "abcd", "mnop"], 5 => ["['abc"], 6 => ["zZzZ']"]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...