我正在尝试编写一个程序,将字符串中的所有大写字符转换为小写和小写字符为大写。例如,如果字符串是“abcdE”,它将在转换“ABCDe”后返回。 这是我到目前为止所尝试的
class String
def is_upper?
self == self.upcase
end
def is_lower?
self == self.downcase
end
end
s = gets.chomp
if s.length <= 100
a = s.split(//)
b, c = Array.new
a.each do |m|
if m.is_upper?
b.push(m.downcase)
end
if m.is_lower?
b.push(m.upcase)
end
end
c = b.join
end
但是我可以评估这个程序是非常错误的。 我仍然是一个新手学习者。如果我的解决方案程序非常错误,请原谅我。请帮助我找到一个正确而简单的解决方案。
答案 0 :(得分:12)
无需再次发明轮子。
在ruby中已经有一个名为swapcase
的方法来实现这一目标。
前 -
"Hello".swapcase #=> "hELLO"
"cYbEr_PuNk11".swapcase #=> "CyBeR_pUnK11"
您可以找到更多详情here -
http://ruby-doc.org/core-2.2.0/String.html#method-i-swapcase
答案 1 :(得分:2)
另据指出,swapcase
已经存在,但我怀疑这是你想要自己实施的东西
这是一种功能性方法
class String
def is_upper?
self == self.upcase
end
def is_lower?
self == self.downcase
end
def head
self[0]
end
def tail
self[1..-1]
end
def swapcase
if empty?
""
elsif head.is_lower?
head.upcase + tail.swapcase
elsif head.is_upper?
head.downcase + tail.swapcase
else
head + tail.swapcase
end
end
end
puts "abcdE".swapcase
#=> ABCDe
swapcase
中的循环模式非常令人讨厌,应该分解为通用函数
class String
def is_upper?
self == self.upcase
end
def is_lower?
self == self.downcase
end
def head
self[0]
end
def tail
self[1..-1]
end
def map &f
if empty?
""
else
yield(head) + tail.map(&f)
end
end
def swapcase
map do |x|
if x.is_lower?
x.upcase
elsif x.is_upper?
x.downcase
else
x
end
end
end
end
它的工作方式相同,但swapcase
现在好多了
puts "abcdE".swapcase
#=> ABCDe
答案 2 :(得分:1)
以下是一种方法:
s = "abcdE"
new_val = s.chars.map do |c|
if c.upcase != c then
c.upcase
elsif (c.downcase != c) then
c.downcase
else
c
end
end.join
p new_val
#=> ABCDe
答案 3 :(得分:1)
"ábcdE".gsub(/./) do |c|
case c
when /\p{Lower}/ then c.upcase
when /\p{Upper}/ then c.downcase
else c
end
#⇒ "ÁBCDe"
有关详细说明,请参阅Regexp
character properties。
答案 4 :(得分:-5)
逻辑应该是这样的。 1.迭代字符串中的字符。 2.如果字符的ASCII码介于97和122之间(包括),则它是大写的,因此从中减去32并将新的字符存储在输出字符数组中。 3.如果字符的ASCII码介于65和90之间(包括),则它是小写的,因此添加32,并存储在输出字符中。 4.如果角色是其他任何东西,你可以离开它,或者取决于问题。 5.将charArray转换为String并输出。
JAVA中的代码
private static String convert(String input){
//upper case 65 to 90, inclusive
//lower case 97 to 122, inclusive
char[] output = new char[input.length()];
int index = 0;
for(char ch: input.toCharArray()){
if((int)ch>=97 && (int)ch<=122){
//upper case character in the String
ch = (char) (ch - 32);
output[index]=ch;
}else if((int)ch>=65 && (int)ch<=90){
//lower case character in the String
ch = (char) (ch + 32);
output[index]=ch;
}else{
//assuming any other character is remained untouched
output[index]=ch;
}
index++;
}
return String.valueOf(output);
}