ruby - 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"]
所以匹配会保留第一个礼物,然后对那些不匹配的礼物进行排序。
解决方案
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 方法(例如 , 等)来执行此操作reduce
。each
但是group_by
更惯用,我建议阅读 Ruby 的 Enumerable 类,因为如果您知道所有可用的方法,则可以通过方法链接完成很多工作给你。
推荐阅读
- notifications - Android 8 中的通知“setSound()”
- powershell - 在 PowerShell 中使用 if 条件进行比较
- spring-batch - Spring Batch - 在处理器中聚合多行
- unity3d - unity google 街景全景图
- string - python 3中插入语句中的变量问题
- google-maps-api-3 - Google Map JS API iframe 未填充
- java - Spring Boot 微服务中的 Spring Cloud Sleuth 日志跟踪
- python - Bokeh Server 与 Flask 错误的集成
- python - 如何在 O(n) 的列表中找到另一个与目标数相加的整数?
- python - Python 尝试使用 .map()