整数に相当するローマ数字を見つける方法. この機能を提供する Java ライブラリはありますか?
同様の質問を見つけましたが、この問題にはすぐに使用できる API 抽象化を使用したいと思います。コードで可能なすべての組み合わせを処理するのは面倒です。
整数に相当するローマ数字を見つける方法. この機能を提供する Java ライブラリはありますか?
同様の質問を見つけましたが、この問題にはすぐに使用できる API 抽象化を使用したいと思います。コードで可能なすべての組み合わせを処理するのは面倒です。
ここには、Java を含む多くの言語のリンクがあります。関連性の抜粋を次に示します。
public class RN {
enum Numeral {
I(1), IV(4), V(5), IX(9), X(10), XL(40), L(50), XC(90), C(100), CD(400), D(500), CM(900), M(1000);
int weight;
Numeral(int weight) {
this.weight = weight;
}
};
public static String roman(long n) {
if( n <= 0) {
throw new IllegalArgumentException();
}
StringBuilder buf = new StringBuilder();
final Numeral[] values = Numeral.values();
for (int i = values.length - 1; i >= 0; i--) {
while (n >= values[i].weight) {
buf.append(values[i]);
n -= values[i].weight;
}
}
return buf.toString();
}
public static void test(long n) {
System.out.println(n + " = " + roman(n));
}
public static void main(String[] args) {
test(1999);
test(25);
test(944);
test(0);
}
}
これは私が使用しているコードで、Excel 列名コンバーターのすぐ隣にあります。このようなもののためのApacheライブラリがないのはなぜですか?
private static final char[] R = {'ↂ', 'ↁ', 'M', 'D', 'C', 'L', 'X', 'V', 'I'};
// or, as suggested by Andrei Fierbinteanu
// private static final String[] R = {"X\u0305", "V\u0305", "M", "D", "C", "L", "X", "V", "I"};
private static final int MAX = 10000; // value of R[0], must be a power of 10
private static final int[][] DIGITS = {
{},{0},{0,0},{0,0,0},{0,1},{1},
{1,0},{1,0,0},{1,0,0,0},{0,2}};
public static String int2roman(int number) {
if (number < 0 || number >= MAX*4) throw new IllegalArgumentException(
"int2roman: " + number + " is not between 0 and " + (MAX*4-1));
if (number == 0) return "N";
StringBuilder sb = new StringBuilder();
int i = 0, m = MAX;
while (number > 0) {
int[] d = DIGITS[number / m];
for (int n: d) sb.append(R[i-n]);
number %= m;
m /= 10;
i += 2;
}
return sb.toString();
}
編集:
もう一度見てみると、ループは次のように要約できます。
for (int i = 0, m = MAX; m > 0; m /= 10, i += 2) {
int[] d = DIGITS[(number/m)%10];
for (int n: d) sb.append(R[i-n]);
}
コードがさらに読みにくくなります;-)