Уменьшение строчных букв только до строчных букв

Я хочу уменьшить строчные буквы только до строчных букв. Я делаю это, беря значение символа 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, отображается заглавная буква. ПРИМЕР: - если я ввожу значение «a» и m как 8, ожидаемый результат должен быть «s». Но я получаю «Y»


person manuka_m    schedule 26.11.2016    source источник
comment
Вы должны предоставить рабочий пример с вводом и ожидаемым выводом.   -  person user6904265    schedule 26.11.2016


Ответы (5)


Здесь charToBeChanged — это символ нижнего регистра, который вы хотите изменить. И decrementValue - это значение, на которое вы хотите сдвинуться. В основном посте вы сказали:

если я ввожу значение «a» и m как 8, ожидаемый результат должен быть «s»

Итак, здесь charToBeChanged равно a, а decrementValue равно 8.

System.out.println((char) ((charToBeChanged - 'a' + 26 - decrementValue) % 26 + 'a'));
person denvercoder9    schedule 26.11.2016
comment
Можете ли вы объяснить, что именно это делает? - person manuka_m; 26.11.2016
comment
Многое зависит от определения «строчной буквы». Является ли \u0f6 строчной буквой? Для меня это. Будет ли это работать с ö? Думаю, нет. - person Michal; 26.11.2016
comment
@Michal Я оставил это на усмотрение OP. Можно использовать простые условия, чтобы определить, когда выполнять этот фрагмент кода. - person denvercoder9; 26.11.2016
comment
@Rafiduzzaman: я считаю, что код Java должен определять последовательность допустимых «строчных букв». - person Michal; 26.11.2016

На мгновение забудьте о кодовой таблице ASCII (или любой другой) и предположите, что буквы нумеруются последовательно от 1 (для a) до 26 (для z). Теперь проблема заключается в простой арифметике по модулю 26. В псевдокоде уменьшение a на 2 преобразуется во что-то вроде

Mod[(1-2),26]

это 25, кодовая точка для y в последовательном коде, описанном выше.

Моя Java смехотворна, поэтому я оставлю OP позаботиться о переводе между значениями кода ASCII и последовательными значениями кода, а также о реализации функции для выполнения операции.

person High Performance Mark    schedule 26.11.2016
comment
Для реализации этого см. ответ @RafiduzzamanSonnet. - person High Performance Mark; 26.11.2016
comment
@Марк, спасибо за объяснение. Я бы понятнее не объяснил :) - person denvercoder9; 26.11.2016
comment
Кодовая таблица ASCII не совсем подходит для этой проблемы. Код Java должен определять свой собственный набор рассматриваемых «строчных букв» и их порядок. Подойдет массив. А затем вычислить положение искомого символа, конечно, используя алгоритм по модулю. - person Michal; 26.11.2016

Это в значительной степени зависит от вашего определения «строчной буквы». Является ли ö строчной буквой? Для меня это. Или č? У меня есть это в моем имени, так что определенно я считаю это строчной буквой.

Поэтому программе необходимо определить собственную последовательность рассматриваемых строчных букв. Обратите внимание, что для примера я включил только символы от a до g и x до 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));
}
}
person Michal    schedule 26.11.2016
comment
Хорошие моменты. Эти академические упражнения, в которых используется арифметика кодовых единиц UTF-16, способствуют узкому мышлению. Определенный алфавит является более общим решением. - person Tom Blodget; 26.11.2016

Вы можете использовать методы 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.

person Lord Thanatos    schedule 26.11.2016
comment
Я надеюсь, что это касается того, что вы пытаетесь сделать. - person Lord Thanatos; 26.11.2016
comment
Я не могу этого сделать, потому что ввод может быть как строчным, так и прописным. Если ввод в верхнем регистре, вывод также должен быть в верхнем регистре - person manuka_m; 26.11.2016
comment
О, я этого не видел, тогда есть гораздо лучшие ответы, чем мои. - person Lord Thanatos; 26.11.2016

Попробуйте с этим:

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);
person user6904265    schedule 26.11.2016