如何在字符串中返回第一个Roman Numeral的索引

时间:2018-03-12 21:10:26

标签: java

这是我的第一个问题,而且我是Java编码的初学者,我对这个主题有疑问。

如果有一个包含罗马数字(i,v,x,l,c,d,m)的字符串s,程序的工作就是返回第一个出现的罗马数字的索引......例如,名为“civil”的字符串将返回0,因为c是第一个罗马数字,其索引为0.

我熟悉字符串indexOf()方法,我试着把它变成:

        int indexc = s.indexOf('c');
        int indexi = s.indexOf('i');
        int indexv = s.indexOf('v');
        int indexl = s.indexOf('l');
        int indexx = s.indexOf('x');
        int indexd = s.indexOf('d');
        int indexm = s.indexOf('m');
        if (indexc >= 0) {
            return indexc;
        } if (indexi >= 0) {
            return indexi;
        } if (indexv >= 0) {
            return indexv;
        } if (indexl >= 0) {
            return indexl;
        } if (indexx >= 0) {
            return indexx;
        } if (indexd >= 0) {
            return indexd;
        } if (indexm >= 0) {
            return indexm;
        } else {
           return -1;
        }

但我不确定这是否应该发生。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

使用正则表达式可以做到最好:

 Matcher matcher = Pattern.compile("[ivxlcdm]").matcher(s);
 int index = matcher.find() ? matcher.start() : -1;

答案 1 :(得分:0)

由于篇幅和可读性,你的答案非常复杂。此外,对于与您编写的顺序不一样的字符串,例如“ic”,您的答案将不正确:您的代码将返回“1”,因为您的代码首先检查是否存在“c”并返回“c” '并且不会同时检查所有罗马数字。

因此,我写了一个不同的答案,应该是一个简单的答案。如果字符串是其中一个想要的字符,则此代码段会检查字符串的每个索引,如果是,则停止并返回该索引。

static int findRomanI(String s){
    for(int i = 0 ; i < s.length() ;i++){
        if(s.charAt(i) == 'i' || 
            s.charAt(i) == 'v' ||
            s.charAt(i) == 'x' ||
            s.charAt(i) == 'l' || 
            s.charAt(i) == 'c' || 
            s.charAt(i) == 'd' || 
            s.charAt(i) == 'm')
            return i;
    }
    return -1;
}

答案 2 :(得分:0)

您的代码正在查找每个字符并按照您希望返回的顺序返回该字符,即先c,然后再i,依此类推。

你可以这样做:

public class IndexOfRomanChar {
    private static final char[] ROMAN_CHARS = {'i', 'v', 'x', 'l', 'c', 'd', 'm'};

    public static void main(String[] args) {
        String word = "civil";

        System.out.println(getIndexOfRomanChar(word));
    }

    private static int getIndexOfRomanChar(String word) {
        for (int i = 0; i < word.length(); i++) {
            for (char c : ROMAN_CHARS) {
                if (word.charAt(i) == c) {
                    return i;
                }
            }
        }
        return -1;
    }
}

此代码首先迭代单词的每个字母,并检查它是否包含在ROMAN_CHARS中的每个项目中,这是我们定义程序应查找的所有可能字母的数组。

答案 3 :(得分:0)

similes方式是将端口C函数称为strbrk。既然我们已经有了strchr - 又名String.indexOf,你可以拥有以下内容:

static int strBrk(String where, String pattern) {
    if(null == where || where.length() == 0)
        return -1;
    if(null == pattern || pattern.length() == 0)
        return -1;
    int ret;
    for(int i=0; i < pattern.length(); i++) {
        ret = where.indexOf(pattern.charAt(i));
        if(ret > 0)
            return (ret - 1);
    }
    return -1;
}
....
System.out.println( strBrk("civil", "ivxlcdm") );
....

另请阅读正则表达式