首页 > 解决方案 > While Loop 不更新 TreeMap 的值

问题描述

我目前正在尝试编写一个将整数从 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();

}

标签: javawhile-loophashmaproman-numerals

解决方案


问题是您正在遍历TreeMap其自然键顺序。

因此,考虑一个像这样的最小罗马地图,具有以下键顺序:

key = 1,value = "I"

key = 5,value = "V"

使用输入6会发生以下情况:

第一key = 1,第一value = "I"number = 6

在你的while循环中,你有,所以通过 key6 >= 1 => true追加"I"和减少。61

然后重复 for 5, 4, 3, 2,1直到while循环不变量被破坏。


但是,如果罗马地图是按降序排列(即与自然顺序相反),您将得到预期的行为:

第一key = 5,第一value = "V"number = 6

你现在有,所以通过键6 >= 5 => true追加"V"和减少,所以。然后,移动到下一个罗马地图条目。6511 >= 5 => false


如何做到这一点?

选项1

使用降序地图视图的入口集:

Map.Entry<Integer, String> entrySet = romanMap.descendingMap().entrySet();

选项 2

TreeMap用自定义构造你的Comparator来改变 的顺序TreeMap,例如:

SortedMap<Integer, String> romanMap = new TreeMap<>((int1, int2) -> Integer.compare(int2, int1));


推荐阅读