我想将小写字母减少为小写字母。我这样做是通过获取字符的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: - 如果我输入&#39; a&#39;并且m值为8,预期输出应该是&#39; s。但我得到了&#39; Y&#39;
答案 0 :(得分:1)
此处charToBeChanged
是您想要移位的小写字符。而decrementValue
是您想要转移多少的价值。在主要帖子中你说:
如果我输入&#39; a&#39;并且m值为8,预期输出应为&#39;
因此,此处charToBeChanged
为a
,decrementValue
为8。
System.out.println((char) ((charToBeChanged - 'a' + 26 - decrementValue) % 26 + 'a'));
答案 1 :(得分:1)
暂时忘记ASCII代码表(或任何其他代码),并假设字母从1
(a
)到26
按顺序编号({{1} }})。问题现在是算术模26的简单问题。在伪代码中,z
递减a
转换为类似
2
是Mod[(1-2),26]
,是上面列出的顺序代码中25
的代码点。
我的Java是可笑的,所以我将把它留给OP来处理ASCII代码值和顺序代码值之间的转换,以及执行操作的函数的实现。
答案 2 :(得分:1)
这很大程度上取决于你对'小写字母'的定义。 ö是小写字母吗?对我来说,它是。还是č?我以我的名义拥有它,所以我绝对认为它是小写字母。
因此程序需要定义自己的小写字母序列。请注意,对于示例,我只包含字符 a到g 和 x到z ,但包括{1或\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));
}
}
答案 3 :(得分: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");
}
请注意,我没有对此进行测试,而且我对Regex有点生疏。
答案 4 :(得分: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);