【发布时间】:2018-07-15 14:34:56
【问题描述】:
我目前正在尝试编写一个将整数从 0-3999 转换为罗马数字的程序,并且我已经获得了正确的代码基础,例如当我键入时6,它产生IIIIII。但是,我希望它转换为正确的罗马数字,即 VI。我觉得我的 While 循环有问题,但似乎无法弄清楚为什么我的 TreeMap 中的 Key 将始终为 1,这意味着数字将始终为 I。我的代码有什么问题,以及如何将其更改为给我正确的罗马数字。任何帮助将不胜感激。
public String generate(int number) {
// System.out.println("NUMBER: " + number);
if (number < MinNumber || number > MaxNumber) {
System.out.println("Number is out of range");
return null;
}
StringBuilder romanToString = new StringBuilder();
NavigableMap<Integer, String> romanMap = createRomanMap();
// TreeMap<Integer, String> romanMap = createRomanMap();
for (Map.Entry<Integer, String> entries : romanMap.entrySet()) {
Integer key = entries.getKey();
String value = entries.getValue();
while (number >= key) {
number -= key;
romanToString.append(value);
}
}
System.out.println("Stringbuilder: " + romanToString.toString());
return romanToString.toString();
}
【问题讨论】:
-
"我的代码基础是正确的,当我输入例如 6 时,它会产生 IIIIII" => 嗯,6 是 VI,不是吗?
-
好吧,因为你的第一个键是 1。然后你递减数字直到它 现在学习使用它。
-
@Seelenvirtuose 是的,但是我的代码没有产生这些数字,这正是我想要的。
-
@JBNizet 我在哪里减量?
-
我认为您需要
romanMap.descendingMap().entrySet()或使用Comparator<Integer>构造您的TreeMap,以确保反向排序。
标签: java while-loop hashmap roman-numerals