【问题标题】:While Loop not updating value of TreeMapWhile Loop 不更新 TreeMap 的值
【发布时间】: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&lt;Integer&gt; 构造您的TreeMap,以确保反向排序。

标签: java while-loop hashmap roman-numerals


【解决方案1】:

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

所以考虑一个像这样的最小罗马地图,带有这个键顺序:

key = 1, value = "I"

key = 5, value = "V"

输入6 会发生以下情况:

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

在您的while 循环中,您有6 &gt;= 1 =&gt; true,因此附加"I" 并通过键6 递减1

然后重复 54321,直到 while 循环不变量被破坏。


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

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

你现在有6 &gt;= 5 =&gt; true,所以追加"V"并通过键6减少5,所以1。 然后1 &gt;= 5 =&gt; false,所以转到下一个罗马地图条目。


如何做到这一点?

选项 1

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

Map.Entry&lt;Integer, String&gt; entrySet = romanMap.descendingMap().entrySet();

选项 2

使用自定义Comparator 构造您的TreeMap 以更改TreeMap 的顺序,例如:

SortedMap&lt;Integer, String&gt; romanMap = new TreeMap&lt;&gt;((int1, int2) -&gt; Integer.compare(int2, int1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多