虽然循环不更新 TreeMap 的值
While Loop not updating value of TreeMap
我目前正在尝试编写一个程序,将 0-3999 的整数转换为罗马数字,并且我已经掌握了正确的代码基础,例如,当我键入6,它产生IIIIII。但是,我希望它转换为正确的罗马数字,即 VI。我觉得我的 While 循环有问题,但似乎无法弄清楚为什么我的 TreeMap 中的键将始终为 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();
}
问题是您正在按其自然键顺序遍历 TreeMap
。
所以考虑像这样的最小罗马地图,使用以下键顺序:
key = 1
, value = "I"
key = 5
, value = "V"
输入 6
会发生以下情况:
第一个key = 1
,第一个value = "I"
,number = 6
在您的 while
循环中您有 6 >= 1 => true
,因此通过键 1
.
附加 "I"
并减少 6
然后重复 5
、4
、3
、2
、1
,直到 while
循环不变量被破坏。
但是,如果罗马地图按降序排列(即与自然顺序相反),您将得到预期的行为:
第一个key = 5
,第一个value = "V"
,number = 6
您现在有 6 >= 5 => true
,所以通过键 5
追加 "V"
并减少 6
,所以 1
。
然后1 >= 5 => false
,所以移动到下一个罗马地图条目。
如何实现?
选项 1
使用降序地图视图的条目集:
Map.Entry<Integer, String> entrySet = romanMap.descendingMap().entrySet();
选项 2
使用自定义 Comparator
构建您的 TreeMap
以更改 TreeMap
的顺序,例如:
SortedMap<Integer, String> romanMap = new TreeMap<>((int1, int2) -> Integer.compare(int2, int1));
我目前正在尝试编写一个程序,将 0-3999 的整数转换为罗马数字,并且我已经掌握了正确的代码基础,例如,当我键入6,它产生IIIIII。但是,我希望它转换为正确的罗马数字,即 VI。我觉得我的 While 循环有问题,但似乎无法弄清楚为什么我的 TreeMap 中的键将始终为 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();
}
问题是您正在按其自然键顺序遍历 TreeMap
。
所以考虑像这样的最小罗马地图,使用以下键顺序:
key = 1
, value = "I"
key = 5
, value = "V"
输入 6
会发生以下情况:
第一个key = 1
,第一个value = "I"
,number = 6
在您的 while
循环中您有 6 >= 1 => true
,因此通过键 1
.
"I"
并减少 6
然后重复 5
、4
、3
、2
、1
,直到 while
循环不变量被破坏。
但是,如果罗马地图按降序排列(即与自然顺序相反),您将得到预期的行为:
第一个key = 5
,第一个value = "V"
,number = 6
您现在有 6 >= 5 => true
,所以通过键 5
追加 "V"
并减少 6
,所以 1
。
然后1 >= 5 => false
,所以移动到下一个罗马地图条目。
如何实现?
选项 1
使用降序地图视图的条目集:
Map.Entry<Integer, String> entrySet = romanMap.descendingMap().entrySet();
选项 2
使用自定义 Comparator
构建您的 TreeMap
以更改 TreeMap
的顺序,例如:
SortedMap<Integer, String> romanMap = new TreeMap<>((int1, int2) -> Integer.compare(int2, int1));