如何将小写字符串转换为大写字母,反之亦然?

时间:2016-05-16 05:25:47

标签: ruby

我正在尝试编写一个程序,将字符串中的所有大写字符转换为小写和小写字符为大写。例如,如果字符串是“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

但是我可以评估这个程序是非常错误的。 我仍然是一个新手学习者。如果我的解决方案程序非常错误,请原谅我。请帮助我找到一个正确而简单的解决方案。

5 个答案:

答案 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);
}