【问题标题】:Decrementing lowercase letters to lowercase letters only仅将小写字母递减为小写字母
【发布时间】:2017-04-10 13:31:27
【问题描述】:

我只想将小写字母减为小写字母。我通过获取字符的 ASCII 值并递减它来做到这一点。但例如,如果我将 a 减 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);

这是我到目前为止的代码。问题是如果我将 a 减 8,它会显示一个大写字母。 EX:- 如果我输入 'a' 和 m 值为 8,预期的输出应该是 's'。但我得到'Y'

【问题讨论】:

  • 您应该提供一个带有输入和预期输出的工作示例。

标签: java character ascii increment decrement


【解决方案1】:

这里charToBeChanged 是您要转换的小写字符。而decrementValue 是您想要转换的值。你在主帖中说:

如果我输入'a'和m值为8,预期的输出应该是's'

所以,这里charToBeChangedadecrementValue 是8。

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

【讨论】:

  • 你能解释一下这到底是做什么的吗?
  • 很大程度上取决于“小写字母”的定义。 \u00f6 是小写字母吗?对我来说,是的。它可以与 \u00f6 一起使用吗?我认为不会。
  • @Michal 我把它留给 OP 来决定。简单的 if 条件可以用来确定何时执行这段代码
  • @Rafiduzzaman:我的观点是 Java 代码应定义有效的“小写字母”序列。
【解决方案2】:

暂时忘记 ASCII 码表(或任何其他),假设字母按从1a)到26z)的顺序编号。现在的问题是一个简单的算术模 26 问题。在伪代码中,将 a 递减 2 转换为类似

Mod[(1-2),26]

这是25,上面列出的顺序代码中y的代码点。

我的 Java 很可笑,所以我将把它留给 OP 来处理 ASCII 码值和顺序码值之间的转换,以及执行操作的函数的实现。

【讨论】:

  • 有关此的实现,请参阅@RafiduzzamanSonnet 的答案。
  • @Mark 谢谢你的解释。我无法更清楚地解释它:)
  • ASCII 码表不太适合这个问题。 Java 代码应定义其自己的一组考虑的“小写字母”及其顺序。一个数组就可以了。然后计算出想要的字符的位置,当然是使用模算法。
【解决方案3】:

这在很大程度上取决于您对“小写字母”的定义。 ö 是小写字母吗?对我来说,是的。还是č?我有它在我的名字,所以我绝对认为它是小写字母。

因此,程序需要定义自己的小写字母序列。请注意,对于示例,我只包含字符 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));
}
}

【讨论】:

  • 好点。这些在 UTF-16 代码单元上使用算术的学术练习促进了狭隘的思维。定义的“字母表”是更通用的解决方案。
【解决方案4】:

您可以使用 equals() 和 to...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 有点生疏。

【讨论】:

  • 我希望能解决你正在尝试做的事情。
  • 我不能这样做,因为输入可以是小写和大写。如果输入为大写,则输出也应为大写
  • 哦,我没看到,当时有比我更好的答案。
【解决方案5】:

试试这个:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2020-08-24
    • 1970-01-01
    相关资源
    最近更新 更多