javaで競技プログラミングをする時に、char型の扱い方がややこしいと感じたので、まとめようと思った。
char型はint型にキャストできる
char型には16進数のUnicode文字が格納されている。
このとき、char型はそのUnicode文字を10進数に直した際の数値を持つ。
例えば、int型の変数にchar型の'1'を代入すれば、49という数値としてとして扱うことができる。
int c = 'a';
System.out.println(c);
//49が出力される
対応する数値からcharに変換する
(char)(数値)でその数値に対応するcharになる。
char c = (char)97;
System.out.println(c);
//'a'が出力される
char型の数字をint型に変換する
数字を羅列した文字列からString.charAt(index)で数字をchar型として取得した時など、char型の数字をint型に変換したい場合がある。
前述のように、char型をそのままint型として使おうとすると別の数値になってしまう。
この場合は、Character.getNumericValue(char c)を用いる。
char c = '1';
int value = Character.getNumericValue(c);
//value == 1
逆に、int型の数字をchar型に変換する場合は、'0'に足せば良い。
int a = 1;
char c = (char)('0'+a);
//c == '1'
char型のアルファベットを扱う
char型の'a'は97、'b'は98というように、char型のアルファベットの持つ数値は連続している。
そのため、以下のようにしてfor文で一つ一つのアルファベットを扱うことができる。
char c = 'a';
for(int i = 0; i < 26; i++){
System.out.print(c);
c++;
}
//abc...が出力される
文字列に各アルファベットがいくつずつ含まれているかを配列に保存することを考える。
String S = "abbcccdefg";
int[] a = new int[26];
for(int i = 0; i < S.length(); i++)
a[S.charAt(i)-'a']++;
'a'の数値を覚えていなくても、'a'が数値として扱えるので問題ない。