【问题标题】:Sort a string array based on a corresponding integer array根据对应的整数数组对字符串数组进行排序
【发布时间】:2017-03-17 23:11:55
【问题描述】:

假设给定一个字符串数组,每个字符串都有相应的权重。比如:

str_arr = ["james", "blake", "rob"]
weights = [4, 7, 1]

str_arr[i] 对应 weights[i]。

我将如何按照权重的升序对 str_arr 进行排序?例如:

(排序后)权重为[1, 4, 7],对应于str_arr = ["rob", "james", "blake"]

我如何获得["rob", "james", "blake"]

大多数排序比较器处理修改当前数组的排序方式,我研究了针对不同数组的现有顺序的排序——但我不确定如何对整数数组进行排序,同时根据整数数组的输出对 str_arr 执行相同操作...有 Rubyist 方法吗?

【问题讨论】:

  • Ruby 方法将使用 Hash 而不是数组 {james: 4, blake: 7, ..} ,对权重值进行排序并使用 .keys 方法来获得您的数组跨度>

标签: arrays ruby sorting


【解决方案1】:

您可以使用sort_bywith_index

str_arr.sort_by.with_index { |_, i| weights[i] }
#=> ["rob", "james", "blake"]

【讨论】:

  • 我看过它(@ArupRakshit 至少使用过一次,如果没记错的话)并试图记住它......是的,要走的路。
【解决方案2】:

您可以通过并行分配执行以下操作:

str_arr, weights = str_arr.zip(weights).sort_by(&:last).transpose
#=> [["rob", "james", "blake"], [1, 4, 7]]

str_arr #=> ["rob", "james", "blake"] 
weights #=> [1, 4, 7]

关键方法:Array#zipEnumerable#sort_byArray#transpose

【讨论】:

  • 如果其中一个权重丢失,这将不起作用,对吗?
  • 颠倒顺序,不需要sort_by : weights.zip(str_arr).sort.transpose
  • @Sunny 不确定您的意思。缺少权重的数组会是什么样子?
【解决方案3】:
str_arr.values_at(*weights.size.times.sort_by { |i| weights[i] })
  #=> ["rob", "james", "blake"]

两个步骤如下。

a = weights.size.times.sort_by { |i| weights[i] }
  #=> [2, 0, 1]
str_arr.values_at(*a)
  #=> ["rob", "james", "blake"]

请参阅 Array#values_atEnumerable#sort_by

【讨论】:

  • O(n*log(n)) 很无聊。这是一个很好的O(n!) 解决方案:str_arr.permutation.to_a[weights.permutation.to_a.index(weights.sort)] ;)
【解决方案4】:

如果你有两个 100% 相互链接的数组,你应该使用 Hash:

str_arr = ["james", "blake", "rob"]
weights = [4, 7, 1]

weights = str_arr.zip(weights).to_h
# {"james"=>4, "blake"=>7, "rob"=>1}

你可以按值排序:

str_arr = ["james", "blake", "rob"]
weights = [4, 7, 1]

weights = str_arr.zip(weights).to_h

p weights.sort_by{|k, v| v}.map(&:first)
#=> ["rob", "james", "blake"]

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2016-10-24
    • 2021-08-17
    • 2012-12-01
    相关资源
    最近更新 更多