0

大家好,我正在尝试编写一个程序来将罗马数字转换为阿拉伯数字。但是,我一直遇到 StringIndexOutOfBoundsException 问题:字符串索引超出范围:-1。下面是我的代码

package com.company;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        System.out.println(romanToArabic("CIV"));
    }
    public static int romanToArabic(String romanNumeral){
        Map <Character, Integer> map = new HashMap<>();
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);

        int result = 0;
        for (int i=0; i < romanNumeral.length(); i++){
            int current = map.get(romanNumeral.charAt(i));
            int next = map.get(romanNumeral.charAt(i-1));
            if (i>0 && current > next){
                result += current - 2*next;
            }

            result += current;
        }
        return result;
    }
4

3 回答 3

1

当“i = 0”时,您的问题在于您的第一次“for循环”迭代

在以下行中,您正确地得到了一个具有索引“0”的字符“C”

int current = map.get(romanNumeral.charAt(i));

然后在下一行“i”在代码执行语句 (i-1) 时变为 -1

int next = map.get(romanNumeral.charAt(i-1));

因此您尝试获取索引为“-1”的字符

int next = map.get(romanNumeral.charAt(-1));

它会跟随你到字符串索引出站异常

因为字符串字符索引从零开始

于 2020-12-05T12:01:20.467 回答
0
int next = map.get(romanNumeral.charAt(i-1));

当您第一次通过循环时,“i-1”为 -1 (i=0)

于 2020-12-05T11:47:08.253 回答
0

如前所述,您从 i = 0 开始,然后尝试 (i-1) 的操作,

通过在 i = 1 处开始循环或仅执行此行(以及其余代码)来解决此问题:

int next = map.get(romanNumeral.charAt(i-1));

如果 i 大于或等于 1。

于 2020-12-06T02:05:37.580 回答