2016-05-16 154 views
1

我正在嘗試編寫一個程序,將字符串中的所有大寫字符都轉換爲大寫的小寫字母和小寫字母。例如,如果字符串是「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 

試過不過我可以評估這個計劃是非常錯誤的。 我還是個新手學習者。所以請原諒我,如果我的解決方案是非常錯誤的。請幫助我找到一個正確和簡單的解決方案。

+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 
+0

可以說,如果這個人是爲了自己來實現它,那麼向他們提供代碼並不是一個合適的方法:) –

+0

我現在看到我的話語中含糊不清。我的意思是暗示「如果你不能依靠內置的ruby方法」^ _ ^無論哪種方式,這種實現是許多可能的解決方案之一。學習者仍然可以從中受益,並在其幫助下找到/建立自己的道路。 – naomik

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

+0

2.3.1是最新的,因此鏈接到文檔時儘量將其固定到最新版本。有時候會有一些有趣的新東西會讓你大吃一驚。 – tadman

+0

感謝您指出這一點。我將來會處理這件事。 – RajSharma

-5

的邏輯應該是這樣的。 1.您遍歷字符串中的字符。 2.如果字符的ASCII碼在97到122(含)之間,那麼它是大寫字母,所以從中減去32並將新字符存儲在輸出字符數組中。 3.如果字符的ASCII碼在65到90(含)之間,那麼它是小寫字母,所以加上32,並存儲在輸出字符中。 4.如果角色是其他任何東西,你可以留下它,或取決於問題。 5.將charArray轉換爲字符串並輸出。在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); 
} 
+0

我懷疑你是因爲假設字符串是ASCII碼而被低估的,並且在Java中提供代碼來標記爲Ruby –

+0

這個問題ok!我會小心向前。 – user754036

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 
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作進一步解釋。

相關問題