将字符串转换为数组后从字符串中删除特定项目

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 字符串转换成数组,再判断某个字符串是不是存在数组中,如果存在删除,不存在添加

SQL Server中如何将特定形式字符串转换为时间格式。并将该时间进行加减

MATLAB如何将数字数组转换成字符串?

MATLAB将元胞数组中特定行列转换为矩阵

如何把一个byte数组转化为字符串

SAP中如何将一个字符串转成UNICODE格式传送?