首页 > 解决方案 > Ruby嵌套迭代以匹配数组中的字符串

问题描述

我试图从字符串数组中找出如何根据字符比较字符串。因此,例如有以下内容:

arr = [4, "string", "gnirts", "strign", "ta", "atc"]

在这种情况下,“ta”和“atc”与其他字符串不匹配。但是“string”、“gnirts”、“strign”匹配。

我的第一个想法是将数组分开,进行长度检查。然后比较字符串并保留第一个存在。

我知道我不关心 4。它只是指示字符串的数量,所以我可以执行 arr.shift(1)。

我知道我可以执行类似 string.chars.sort 之类的操作,但是如何比较数组中的字符串?

我在想类似的事情:

arr.each_with_index do |value, index|
 index.each do |item|
  if value.chars.sort == item
   return value
 end
end

这绝对行不通。

我最终想要看到的内容将在数组上进行排序,所以我最终会得到 atc、gnirts 和 string(因为其他匹配它并且 string 排在第一位)。

那么我如何最终比较数组中的字符串并以数字形式保留第一个字符串?

编辑:输入类似于 [4, "string", "gnirts", "strign", "ta", "atc"] 输出数组将是

["atc", "ta", "string"]

所以匹配会保留第一个礼物,然后对那些不匹配的礼物进行排序。

标签: ruby

解决方案


input = [4, "string", "gnirts", "strign", "ta", "atc"]

input.
  drop(1).
  group_by { |str| str.chars.sort.join }.
  values.
  map(&:first)

# => ["string", "ta", "atc"]

逐行遍历:

input.

  drop(1).
  # => ["string", "gnirts", "strign", "ta", "atc"]]

  group_by { |str| str.chars.sort.join }.
  # => {
  #      "ginrst" => ["string", "gnirts", "strign"],
  #      "at"     => ["ta"],
  #      "act"    => ["atc"]
  #    }

  values.
  # => [
  #       ["string", "gnirts", "strign"],
  #       ["ta"],
  #       ["atc"]
  #    ]

  map(&:first)
  # => ["string", "ta", "atc"]

正如 lacostenycoder 提到的,您可能希望反转输出以匹配预期的内容。

可以使用其他 Enumerable 方法(例如 , 等)来执行此操作reduceeach但是group_by更惯用,我建议阅读 Ruby 的 Enumerable 类,因为如果您知道所有可用的方法,则可以通过方法链接完成很多工作给你。


推荐阅读