将字符串转换为数组后从字符串中删除特定项目
Posted
技术标签:
【中文标题】将字符串转换为数组后从字符串中删除特定项目【英文标题】:Removing specific items from a string after transforming it an array 【发布时间】:2021-03-31 00:37:27 【问题描述】:所以我在下面所做的是从用户那里获取一个数字并将字母表中的字母转换为该特定数字。例如,当 str = "aby" 且 num = 3 时,输出将为 "deb"。它只适用于字母。但是会有标点符号、空格等,如果我输入“A by 3”。作为字符串,我遇到诸如 Nomethod 错误之类的错误。(输出应为:“D eb 3。”)如何移动字母并同时保持其他字母不变?
ps:请不要为此编写新代码。我只是想解决我自己的代码问题。谢谢。
puts "Please type a number: "
num = gets.chomp.to_i
alp = ("a".."z").to_a
# This is the erroneous part :
str = "aby".split("")
number_conv = str.map |a| alp.index(a) + num
letter_conv = number_conv.map do |e|
if e + num < 26
alp[e]
else
e = (e + num) % 26
alp[e - num]
end
end
p letter_conv.join
【问题讨论】:
【参考方案1】:包装您的代码以将字符转换为函数。转移时添加条件以忽略特殊字符。
在正文中,用空格分割句子并将每个单词传递给上述函数。
def shift mystr, num
ignore = %w( ) ? , # put all the characters you want to ignore here.
alp = ("a".."z").to_a
str = mystr.split("")
number_conv = str.map |a| ignore.include?(a) ? a : alp.index(a) + num
letter_conv = number_conv.map do |e|
if ignore.include?(e)
e
elsif e + num < 26
alp[e]
else
e = (e + num) % 26
alp[e - num]
end
end
letter_conv.join
end
puts "Please type a number: "
num = gets.chomp.to_i
puts "Please type a string: "
str = gets.chomp
puts str.split.map |i| shift i, num.join(" ")
【讨论】:
我确实理解 def 背后的逻辑,但是当 str = A bc 和 num = 2 时,我到达了“Bcd”而不是“B cd”。它以某种方式删除了空格。这是为什么? (我在忽略数组中添加了空格字符。) 顺便说一句,我在最后一行将 join(" ") 更改为 join("") 。否则,它会在每个字母后添加空格。 @elixir 对不起,我忘了复制函数letter_conv.join
的最后一行。已编辑。您必须恢复您的 join("") 更改。这是保留空格的原因。
因此, letter_conv.join 将数组转换为字符串,最后的 join(" ") 用空格分隔单词。我说对了吗?以上是关于将字符串转换为数组后从字符串中删除特定项目的主要内容,如果未能解决你的问题,请参考以下文章
JS 字符串转换成数组,再判断某个字符串是不是存在数组中,如果存在删除,不存在添加