2016-11-26 3 views
3

Я хочу уменьшить буквы нижнего регистра только строчными буквами. Я делаю это, беря значение 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); 

Это код, который у меня есть до сих пор. Проблема с этим заключается в том, что если я уменьшаю значение на 8, он показывает букву верхнего регистра. EX: - если я вводим значения «a» и m как 8, ожидаемый результат должен быть «s». Но im get '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"); 
} 

Обратите внимание, что я не тестировал это, и я немного ржав с Regex.

+0

Надеюсь, это касается того, что вы пытаетесь сделать. –

+0

Я не могу это сделать, потому что ввод может быть строчным и прописным. Если вход находится в верхнем регистре, вывод также должен быть в верхнем регистре –

+0

О, я не видел этого, есть гораздо лучшие ответы, чем мои. –

1

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

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

Итак, здесь charToBeChanged является a и decrementValue 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

Try с этим:

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 в 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)); 
} 
} 
+0

Хорошие очки. Эти академические упражнения, которые используют арифметику для кодовых блоков UTF-16, способствуют узкому мышлению. Определенный «алфавит» является более общим решением. –