2016-11-26 207 views
3

我只想將小寫字母減少爲小寫字母。我通過獲取字符的ASCII值並將其遞減。但是,例如,如果我遞減2,答案應該是y。不是符號或大寫字母。僅將小寫字母減小爲小寫字母

int charValue = temps.charAt(i); 
String increment = String.valueOf((char) (charValue - (m))); 
if((charValue - m) < 65){ 
    int diff = 65 - (charValue - m); 
    increment = String.valueOf((char) (91 - diff)); 
}else if((charValue - m) < 97 && (charValue - m) >= 91){ 
    int diff = 97 - (charValue - m); 
    increment = String.valueOf((char) (123 - diff));  
} 
System.out.print(increment); 

這是我到目前爲止的代碼。這個問題是如果我遞減8,它顯示一個大寫字母。 EX: - 如果我輸入'a'和m值爲8,預期的輸出應該是's'。但即時獲得'Y'

+2

您應該提供一個有關輸入和預期輸出的工作示例。 – user6904265

回答

0

您可以使用equals()和... Case方法來檢查輸入是什麼,然後將輸出轉換爲相同的大小寫。

if(charValue.equals("[a-z; A-z]")){ 

    if(charValue.equals(increment)){ 
     System.out.println(increment); 
    } 
    if(!charValue.equals(increment)){ 
     System.out.println(increment.toUpperCase()); 
    } 
    if(!charValue.equals(increment)){ 
     System.out.println(increment.toLowerCase()); 
    } 
}else{ 
    System.out.println("Not a letter"); 
} 

請注意,我沒有測試過這個,我用正則表達式有點生疏。

+0

我希望能解決你所要做的事情。 –

+0

我不能這樣做,因爲輸入可以是小寫字母和大寫字母。如果輸入是大寫的,輸出也應該是大寫的 –

+0

哦,我沒有看到,有比我更好的答案。 –

1

這裏charToBeChanged是您想要移位的小寫字符。而decrementValue是你想要轉移多少的價值。在主後對你說:

如果我輸入 'A' 和M值8,預期輸出應該是 'S'

所以,這裏charToBeChangedadecrementValue是8。

System.out.println((char) ((charToBeChanged - 'a' + 26 - decrementValue) % 26 + 'a')); 
+0

你能解釋一下這是什麼嗎? –

+0

取決於'小寫字母'的定義。是\小寫字母嗎?對我來說,這是。它會與\ u00f6一起工作嗎?我想不是。 – Michal

+0

@Michal我把它留給OP來決定。如果條件可以用來確定何時執行這段代碼,那麼很簡單 – rafid059

1

一時間忘記ASCII碼錶(或任何其他),並假設的字母按順序編號從1(對於a)至26(對於z)。現在的問題是算術模26的簡單的事僞代碼,遞減a通過2轉化爲類似

Mod[(1-2),26] 

這是25,在上面列出的順序代碼的代碼點爲y

我的Java很可笑,所以我將它留給OP來處理ASCII代碼值和順序代碼值之間的轉換以及執行該操作的函數的實現。

+0

對於這個的實現,請參閱@ RafiduzzamanSonnet的答案。 –

+0

@Mark謝謝你的解釋。我不能更清楚地解釋它:) – rafid059

+0

ASCII代碼表不適合這個問題。 Java代碼應該定義它自己的一組被認爲的「小寫字母」及其排序。一個數組會做。然後計算想要的字符的位置,當然使用模算法。 – Michal

0

嘗試這樣的:

int charValue = 'a'; 
int m = 8; 
String increment = null; 
//if a-z 
if(charValue>96 && charValue<123){ 
    int difference = charValue - m; 
    if(difference < 97) 
     difference+=26; 
    increment = String.valueOf((char) difference); 
} 
System.out.println(increment); 
1

它幾乎取決於你的「小寫字母」的定義。小寫字母是否是ö?對我來說,這是。或者č?我有我的名字,所以我認爲它是小寫字母。

因此程序需要定義自己的小寫字母序列。請注意,對於示例,我只包含字符a到gx到z,但任何內容(包括\u010D代表ö或\u00f6代表ö)都可以包含在列表中。

public class DecrementChars { 

List<Character> validLowercaseChars 
    = Arrays.asList('a', 'b', 'c', 'd', 'e', 'f', 'g', 'x','y', 'z'); 

boolean isLowercaseletter(char letter) { 
    return validLowercaseChars.contains(letter); 
} 

char decrement(char input, int decrement) { 
    if(!isLowercaseletter(input)) { 
     throw new IllegalArgumentException(); 
    } 
    int inputIndex = validLowercaseChars.indexOf(input); 
    int size = validLowercaseChars.size(); 
    int outputIndex = (size + inputIndex - decrement) % size; 
    return validLowercaseChars.get(outputIndex); 
} 

@Test(expected=IllegalArgumentException.class) 
public void thatDecrementOfInvalidInputThrows() { 
    decrement('9', 1); 
} 


@Test 
public void thatDecrementOfbByOneGetsa() { 
    Assert.assertEquals('a', decrement('b', 1)); 
} 

@Test 
public void thatDecrementOfaByTwoGetsy() { 
    Assert.assertEquals('y', decrement('a', 2)); 
} 
} 
+0

好點。這些使用UTF-16編碼單元算術的學術練習促進了狹義思維。定義的「字母表」是一個更一般的解決方案。 –