gpt4 book ai didi

ruby - 如果包含特定单词,则修改 Ruby 中的数组项

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:26 26 4
gpt4 key购买 nike

我找不到这个问题的解决方案,我进行了研究以找到问题并解决它们,但还想不出任何答案。

我想做的是将字符串转换为标题大小写的字符串

例如:《指环王》>《指环王》

(可以看到,第一个单词总是大写,如果是文章没关系,但是如果字符串中有文章单词,那应该是小写的,如上例,并将任何其他不是大写的单词大写)。

这是我要解决的练习的规范 (RSpec):

describe "Title" do
describe "fix" do
it "capitalizes the first letter of each word" do
expect( Title.new("the great gatsby").fix ).to eq("The Great Gatsby")
end
it "works for words with mixed cases" do
expect( Title.new("liTTle reD Riding hOOD").fix ).to eq("Little Red Riding Hood")
end
it "downcases articles" do
expect( Title.new("The lord of the rings").fix ).to eq("The Lord of the Rings")
expect( Title.new("The sword And The stone").fix ).to eq("The Sword and the Stone")
expect( Title.new("the portrait of a lady").fix ).to eq("The Portrait of a Lady")
end
it "works for strings with all uppercase characters" do
expect( Title.new("THE SWORD AND THE STONE").fix ).to eq("The Sword and the Stone")
end
end
end

这是我的尝试,到目前为止我所拥有的:

class Title
def initialize(string)
@string = string
end

def fix
@string.split.each_with_index do |element, index|
if index == 0
p element.capitalize!
elsif index == 1
if element.include?('Is') || element.include?('is')
p element.downcase!
end
end
end
end
end

a = Title.new("this Is The End").fix
p a

输出:

“这个”

"is"

=> ["这个", "是", "该", "结束"]


我尝试做的事情:

  1. 创建一个名为 Title 的类并使用字符串对其进行初始化。
  2. 创建一个名为 fix 的方法,到目前为止,它只检查索引 0@string.split.each_with_index 方法(循环通过),并打印 element.capitalize!(注意“爆炸”,即应该修改原始字符串,正如您在输出中看到的那样以上)
  3. 我的代码所做的是检查索引 1(第二个字)和调用 .include?('is') 查看第二个词是否是文章,如果是(使用 if 语句),则调用 element.downcase!,如果没有,我可以为索引创建更多检查(但我意识到这里是一些字符串可以由 3 个单词组成,其他的由 5 个单词组成,其他人增加 10,依此类推,所以我的代码对此效率不高,这是我无法解决的问题。

也许创建文章单词列表并使用 .include 检查?如果列表中有某个单词,方法是什么? (我尝试了这个方法,但是 .include? 方法只接受字符串而不是数组变量,我尝试了 join(' ') 方法但没有成功)。

非常感谢! 真的!

最佳答案

我喜欢将这些类型的问题分解成更小的逻辑 block ,以帮助我在编写算法之前理解。在这种情况下,您需要根据某些规则修改字符串的每个单词。

  1. 如果是第一个词,就大写。
  2. 如果不是特殊词,就大写。
  3. 如果它是一个特殊词并且不是第一个词,请将其小写。

使用这些规则,您可以编写要遵循的逻辑。

special_words = ['a', 'an', 'and', 'of', 'the']
fixed_words = []
@string.downcase.split.each_with_index do |word, index|
# If this isn't the first word, and it's special, use downcase
if index > 0 and special_words.include?(word)
fixed_words << word
# It's either the first word, or not special, so capitalize
else
fixed_words << word.capitalize
end
end
fixed_words.join(" ")

您会注意到我在调用 split 和 each_with_index 之前对字符串使用了小写字母。这样一来,所有单词都被规范化为小写,并且可以很容易地根据 special_words 数组进行检查。

我还将这些转换后的单词存储在一个数组中,最后将它们重新组合在一起。这样做的原因是,如果我尝试使用小写字母!或大写!在拆分字符串上,我没有修改原始标题字符串。

Note: This problem is part of the Bloc Full Stack course work which is why I'm using a simplified solution, rather than one liners, modules, file io, etc.

关于ruby - 如果包含特定单词,则修改 Ruby 中的数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28056877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com