Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 按其他数组对数组排序_Ruby_Arrays - Fatal编程技术网

Ruby 按其他数组对数组排序

Ruby 按其他数组对数组排序,ruby,arrays,Ruby,Arrays,我有两个阵列: a = [ 1, 0, 2, 1, 0] b = ['a', 'b', 'c', 'd', 'e'] 我想根据a的元素值对b数组进行排序。 我可以通过将两个数组合并成一个散列和按键排序来实现这一点: h = Hash[b.zip a] => {"a"=>1, "b"=>0, "c"=>2, "d"=>1, "e"=>0} h2 = Hash[h.sort_by{|k, v| v}] => {"b"=>0, "e"=>0,

我有两个阵列:

a = [ 1, 0, 2, 1, 0]
b = ['a', 'b', 'c', 'd', 'e']
我想根据
a
的元素值对
b
数组进行排序。 我可以通过将两个数组合并成一个散列和按键排序来实现这一点:

h = Hash[b.zip a]
=> {"a"=>1, "b"=>0, "c"=>2, "d"=>1, "e"=>0}

h2 = Hash[h.sort_by{|k, v| v}]
=> {"b"=>0, "e"=>0, "a"=>1, "d"=>1, "c"=>2}

array = h2.keys
=> ["b", "e", "a", "d", "c"]
如果出现平局,则可以任意选择顺序

是否有一种方法(可能更紧凑),我可以实现这一点而不使用散列

a.zip(b).sort.map(&:last)
部分:

p a.zip(b) # => [[1, "a"], [0, "b"], [2, "c"], [1, "d"], [0, "e"]] 
p a.zip(b).sort # => [[0, "b"], [0, "e"], [1, "a"], [1, "d"], [2, "c"]] 
p a.zip(b).sort.map(&:last) # => ["b", "e", "a", "d", "c"]

…也可以这样写:
[a,b].transpose.sort.map(&:last)
@CarySwoveland它不是完全等效的,因为错误行为不同。如果数组大小不同,
zip
将填充
nil
,但是
transpose
将抛出错误。谢谢,@MarkThomas。是的,但在本例中,我认为假设数组大小相同是合理的,因为它们在示例中,并且没有为大小不等的情况给出规则。但是你确实对
zip
transpose
提出了很好的观点。
a = [ 1, 0, 2, 1, 0]
b = ['a', 'b', 'c', 'd', 'e']

p b.sort_by.each_with_index{|el,i| a[i]}
# => ["b", "e", "a", "d", "c"]