仅将小写字母减小为小写字母

时间:2016-11-26 09:47:49

标签: java character ascii increment decrement

我想将小写字母减少为小写字母。我这样做是通过获取字符的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;

5 个答案:

答案 0 :(得分:1)

此处charToBeChanged是您想要移位的小写字符。而decrementValue是您想要转移多少的价值。在主要帖子中你说:

  

如果我输入&#39; a&#39;并且m值为8,预期输出应为&#39;

因此,此处charToBeChangedadecrementValue为8。

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

答案 1 :(得分:1)

暂时忘记ASCII代码表(或任何其他代码),并假设字母从1a)到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);