2016-11-26 6 views
3

小文字を小文字にのみ減らしたい。私はキャラクターの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); 

これはこれまでのコードです。この問題は、私がaを8だけ減らすと、大文字が表示されます。 EX: 'a'とmの値を8と入力すると、期待される出力は 's'になります。しかし、私は 'Y'を取得します

+2

入力と予想される出力の例を提示する必要があります。 – user6904265

答えて

0

あなたは、入力が何だったのかを確認して、同じケースに出力を変換するために、equals()とto ...ケースメソッドを使うことができます。

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は、どれだけシフトしたいのかによる値です。メインポストでは、言った:

場合、私入力 'A' とm値8として、期待される出力は 'S'

だから、ここcharToBeChangedadecrementValueが8であるべきです。モーメントについて

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

これは正確に何を説明できますか? –

+0

'小文字'の定義に大きく依存します。 \ u00f6は小文字ですか?私のために、そうです。それは\ u00f6で動作しますか?私はそうは思わない。 – Michal

+0

@Michal私は決定のためにそれをOPに残しました。このコードを実行するタイミングを判断するための条件がある場合は、 – rafid059

1

ASCIIコード表(または他)を忘れると文字がに(a用)1から順番に番号が付けられていると仮定3210(zの場合)。問題は2によってa25、上記で概説したシーケンシャルなコードでyためのコードポイントである

Mod[(1-2),26] 

のようなものに変換デクリメント、今擬似コードで算術モジュロ26の単純な問題です。

私のJavaは面白いので、ASCIIコード値とシーケンシャルコード値の間の変換、および操作を実行する関数の実装については、OPに任せておきます。

+0

この実装については、@ RafiduzzamanSonnetの答えを参照してください。 –

+0

@マークあなたの説明をありがとう。私はそれをより明確に説明できなかったでしょう:) – rafid059

+0

ASCIIコードテーブルは、この問題にはあまり適していません。 Javaコードは、それ自身の「小文字」とその順序付けのセットを定義します。配列が行います。もちろん、モジュロアルゴリズムを使用して、必要なチャートの位置を計算します。 – Michal

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

これはかなり「小文字」のあなたの定義に依存します。 öは小文字ですか?私のために、そうです。またはč?私は私の名前でそれを持っているので、間違いなく私はそれを小文字と見なします。

したがって、プログラムは、考えられる小文字のシーケンスを定義する必要があります。この例では、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)); 
} 
} 
+0

良い点。 UTF-16コード単位で算術演算を使用するこれらの学術演習では、狭い思考が促進されます。定義された「アルファベット」はより一般的な解決策です。 –

関連する問題