2016-11-26 212 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编码单元算术的学术练习促进了狭义思维。定义的“字母表”是一个更一般的解决方案。 –