虽然循环不更新 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

然后重复 54321,直到 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));