在接受采访时被问及:
在任何字符串中给出,让我第一次出现整数。
例如
Str98 然后它应该返回 98
Str87uyuy232 - 它应该返回 87
我将答案作为字符串循环并将其与数字字符进行比较,如
if ((c >= '0') && (c <= '9'))
然后我得到了数字的索引,解析了它并返回了它。不知怎的,他不相信。 任何人都可以分享最好的解决方案吗?
答案 0 :(得分:39)
使用正则表达式,它非常简单:
String s = new String("Str87uyuy232");
Matcher matcher = Pattern.compile("\\d+").matcher(s);
matcher.find();
int i = Integer.valueOf(matcher.group());
<子>(Thanks to Eric Mariacher)子>
答案 1 :(得分:26)
使用java.util.Scanner
:
int res = new Scanner("Str87uyuy232").useDelimiter("\\D+").nextInt();
Scanner
的目的是从输入中提取标记(此处为String
)。标记是由分隔符分隔的字符序列。默认情况下,Scanner
的分隔符是空格,因此标记是以空格分隔的单词。
在这里,我使用分隔符\D+
,这意味着“任何不是数字的东西”。我们的Scanner
可以在字符串中读取的标记是“87”和“232”。 nextInt()
方法将读取第一个方法。
nextInt()
会抛出java.util.NoSuchElementException
。在调用hasNextInt()
之前调用方法nextInt()
,检查是否有要阅读的内容。
答案 2 :(得分:16)
此解决方案存在两个问题。
考虑测试用例 - 有2个字符'8'和'7',它们都形成你应该返回的整数87。 (这是主要问题)
这有点迂腐,但字符'0'的整数值不一定小于'1','2'等的值。它可能几乎总是如此,但我想是采访者喜欢看到这种关怀。更好的解决方案是
if(Character.isDigit(c)){...}
有很多不同的方法可以做到这一点。我的第一个想法是:
int i = 0;
while (i < string.length() && !Character.isDigit(string.charAt(i))) i++;
int j = i;
while (j < string.length() && Character.isDigit(string.charAt(j))) j++;
return Integer.parseInt(string.substring(i, j)); // might be an off-by-1 here
当然,正如评论中所提到的,在Java中使用正则表达式功能可能是最好的方法。但是当然很多面试官要求你做这样的事情,没有图书馆等......
答案 3 :(得分:6)
String input = "Str87uyuy232";
Matcher m = Pattern.compile("[^0-9]*([0-9]+).*").matcher(input);
if (m.matches()) {
System.out.println(m.group(1));
}
答案 4 :(得分:1)
以防您需要非正则表达式而不使用其他实用程序。
你去吧
public static Integer returnInteger(String s)
{
if(s== null)
return null;
else
{
char[] characters = s.toCharArray();
Integer value = null;
boolean isPrevDigit = false;
for(int i =0;i<characters.length;i++)
{
if(isPrevDigit == false)
{
if(Character.isDigit(characters[i]))
{
isPrevDigit = true;
value = Character.getNumericValue(characters[i]);
}
}
else
{
if(Character.isDigit(characters[i]))
{
value = (value*10)+ Character.getNumericValue(characters[i]);
}
else
{
break;
}
}
}
return value;
}
}
答案 5 :(得分:0)
你也可以去更低的水平。快速查看ASCII values显示字母字符从65开始。数字从48 - 57开始。在这种情况下,您可以简单地'和'n对127的字符,看看该值是否符合阈值,48 - 57.
char[] s = "Str87uyuy232".toCharArray();
String fint = "";
Boolean foundNum = false;
for (int i = 0; i < s.length; i++)
{
int test = s[i] & 127;
if (test < 58 && test > 47)
{
fint += s[i];
foundNum = true;
}
else if (foundNum)
break;
}
System.out.println(fint);
这样做不会对现实世界(不同的角色集)有好处,但是作为拼图解决方案很有趣。