40

これよりも数字をアルファベットに変換するより良い方法はありますか?

private String getCharForNumber(int i) {
    char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    if (i > 25) {
        return null;
    }
    return Character.toString(alphabet[i]);
}

26 より大きい数値をよりエレガントに処理できるものではないでしょうか?

4

16 に答える 16

79

ASCII 表現を利用するだけです。

private String getCharForNumber(int i) {
    return i > 0 && i < 27 ? String.valueOf((char)(i + 64)) : null;
}

i注: これは、が と の間1にあることを前提としてい26ます。

ゼロベースにしたい場合は、条件をに変更しi > -1 && i < 26、インクリメントをに変更する必要があります。65i

参照する必要がある場合に備えて、完全な ASCII テーブルを次に示します。


ここに画像の説明を入力


編集:

'A'一部の人々がここで提案したように、ASCII コードの代わりに文字を直接使用する方がはるかに読みやすいです。

private String getCharForNumber(int i) {
    return i > 0 && i < 27 ? String.valueOf((char)(i + 'A' - 1)) : null;
}
于 2012-05-30T09:11:30.200 に答える
36

0 から 25 以外の入力に対してエラーやセンチネル値 (「?」など) を与えるよりも、すべての整数に対して明確に定義された文字列を使用すると便利な場合があります。私は以下を使用するのが好きです:

   0 ->    A
   1 ->    B
   2 ->    C
 ...
  25 ->    Z
  26 ->   AA
  27 ->   AB
  28 ->   AC
 ...
 701 ->   ZZ
 702 ->  AAA
 ...

これはネガにも拡張できます。

  -1 ->   -A
  -2 ->   -B
  -3 ->   -C
 ...
 -26 ->   -Z
 -27 ->  -AA
 ...

Java コード:

public static String toAlphabetic(int i) {
    if( i<0 ) {
        return "-"+toAlphabetic(-i-1);
    }

    int quot = i/26;
    int rem = i%26;
    char letter = (char)((int)'A' + rem);
    if( quot == 0 ) {
        return ""+letter;
    } else {
        return toAlphabetic(quot-1) + letter;
    }
}

英数字 (base 36) または大文字と小文字を区別する (base 62) アルファベットを使用する機能を含む Python コード:

def to_alphabetic(i,base=26):
    if base < 0 or 62 < base:
        raise ValueError("Invalid base")

    if i < 0:
        return '-'+to_alphabetic(-i-1)

    quot = int(i)/base
    rem = i%base
    if rem < 26:
        letter = chr( ord("A") + rem)
    elif rem < 36:
        letter = str( rem-26)
    else:
        letter = chr( ord("a") + rem - 36)
    if quot == 0:
        return letter
    else:
        return to_alphabetic(quot-1,base) + letter
于 2015-05-15T12:38:04.627 に答える
5

char文字列の代わりに文字を返します。

public static char getChar(int i) {
    return i<0 || i>25 ? '?' : (char)('A' + i);
}

注:文字デコーダーが文字を認識しない場合は、?

ASCIIコードを検索する代わりに'A'使用します。'a'

于 2012-05-30T09:19:11.297 に答える
4

個人的にはもっと好き

return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".substring(i, i+1);

バッキングを共有しchar[]ます。または、次に読みやすいアプローチは次のとおりだと思います

return Character.toString((char) (i + 'A'));

これは、ASCII テーブルの記憶に依存しません。検証は行いませんが、必要に応じて書きたいと思います

char c = (char) (i + 'A');
return Character.isUpperCase(c) ? Character.toString(c) : null;

アルファベットであることを確認していることを明確にするためです。

于 2012-05-30T09:14:40.130 に答える
4

a/A を 0 と定義した場合

char res;
if (i>25 || i<0){
    res = null;
}
    res = (i) + 65
}
return res;

大文字の場合は 65。大文字以外の場合は 97

于 2012-05-30T09:12:57.923 に答える
2
public static String abcBase36(int i) {
    char[] ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    int quot = i / 36;
    int rem = i % 36;

    char letter = ALPHABET[rem];
    if (quot == 0) {
        return "" + letter;
    } else {
        return abcBase36(quot - 1) + letter;
    }
}
于 2015-10-16T09:14:40.167 に答える
1

入力を基数 26 (16 進数) に変換し、各「数字」を基数 10 に個別に変換して、ASCII マッピングを適用できます。A は 0 にマップされるため、A、B、C、...、Y、Z、BA、BB、BC などの結果が得られます。これは、入力値の要件に応じて、望ましい場合と望ましくない場合があります。 > 26、AA が Z の後に来ると考えるのが自然かもしれないからです。

public static String getCharForNumber(int i){

    // return null for bad input
    if(i < 0){
        return null;
    }

    // convert to base 26
    String s = Integer.toString(i, 26);

    char[] characters = s.toCharArray();

    String result = "";
    for(char c : characters){
        // convert the base 26 character back to a base 10 integer
        int x = Integer.parseInt(Character.valueOf(c).toString(), 26);
        // append the ASCII value to the result
        result += String.valueOf((char)(x + 'A'));          
    }

    return result;
}
于 2013-05-08T13:27:10.420 に答える
1
public static string IntToLetters(int value)
{
string result = string.Empty;
while (--value >= 0)
{
    result = (char)('A' + value % 26 ) + result;
    value /= 26;
}
return result;
}

A が 0 ではなく 1 であるという要件を満たすために、while ループ条件に追加し、ループの最後から値を削除しました。変更を元に戻すか、単純に value++ を追加できます。メソッド全体の最初に。

于 2015-09-16T12:28:23.390 に答える
1

int からアルファベット値を取得するには、次のように簡単に実行できます。

(char)('@' + i)
于 2017-05-24T16:14:02.440 に答える
0

別のバリアント:

private String getCharForNumber(int i) {
    if (i > 25 || i < 0) {
        return null;
    }
    return new Character((char) (i + 65)).toString();
}
于 2012-05-30T09:20:24.667 に答える
0

0から開始して返す別のアプローチString

public static String getCharForNumber(int i) {
    return i < 0 || i > 25 ? "?" : String.valueOf((char) ('A' + i));
}
于 2016-07-05T14:11:56.987 に答える
0

次のように試すことができます:

private String getCharForNumber(int i) {
    CharSequence css = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    if (i > 25) {
        return null;
    }
    return css.charAt(i) + "";
}
于 2012-05-30T09:18:37.917 に答える
0

これは正確な答えではありませんが、私が作成した便利な/関連するコードです。それを実行し、コマンド ラインに任意の文字を入力するとgetNumericValue(char)... が返されますが、これは ASCII テーブルと同じようには見えないので注意してください。とにかく、あなたの質問への直接的な答えではありませんが、うまくいけば役に立ちます:

import java.lang.*;
import java.util.*;
/* charVal.java
         */

//infinite loops. whenever you type in a character gives you value of 
//getNumericValue(char)
//
//ctrl+c to exit



public class charVal {
   public static void main(String[] args) {
     Scanner inPut = new Scanner(System.in);
     for(;;){
       char c = inPut.next().charAt(0);
       System.out.printf("\n %s = %d \n", c, Character.getNumericValue(c));
     }
    }
}
于 2013-10-28T10:26:56.263 に答える