这是我的第一个问题,而且我是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;
}
但我不确定这是否应该发生。有什么想法吗?
答案 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") );
....
另请阅读正则表达式