我正在尝试减少我正在处理的程序的运行时间,并且我想找出一种更简单的方法来查找具有整数值的字符的索引。
目前,我的函数会跟踪字符串的每个字符,并返回它找到的第一个整数的索引。例如,如果我有字符串JohnCena1237728394712
(是的,这是我想到的第一个字符串),该函数应该返回8,因为字符串中出现的第一个整数1是索引8。然而,首先在每个字符之前循环以找到该索引,并且有时会变得昂贵。
如果在尝试考虑更简单的方法时有帮助,我可以确定进入函数,字符串的格式将始终是“[letters]”+“[numbers]”所以我只是必须找到(可能是随机的)字母段的结尾才能得到我想要的东西。
我想要做的是使用indexOf()所以我不必使用循环,但我不知道如何使用该函数而不需要10个if语句(当然,这会打败目的)。
有没有办法在使用indexOf()或其他函数时一次检查多个整数?
答案 0 :(得分:2)
您可以使用正则表达式匹配器执行此操作。
类似的东西:
Pattern pattern = Pattern.compile("\\d");
Matcher matcher = pattern.matcher(inputString);
if(matcher.find()) {
return matcher.first();
}
return -1;
这是相当可读和可扩展的。与通过字符串的简单for
循环相比,有些人可能认为它过度杀伤。编译正则表达式需要时间,并且您创建了几个对象,如果您对性能狂热,所有这些都会花费。
for(int i=0; i<str.length; i++) {
char c = str.charAt(i);
if(c >='0' && c <= '9') {
return i;
}
}
return -1;
必要时,有些东西必须依次查看每个字符,所以在某个地方会有一个循环,无论你是在写它还是在你调用的库方法中。
您可以通过将String分解为块并执行map-reduce-ish来从多个核心中挤出一些速度。但这对于数字很少的真正巨大的字符串来说是值得的。
答案 1 :(得分:1)
方法是使用正则表达式,这是表示字符串内容的一种非常强大的方式..
py_modules
使用课程String str = "Hello world";
str.matches("\\w+ \\w+"); // returns true
和Pattern
。
Matcher
答案 2 :(得分:0)
您可以检查字符的ascii以查看它是否为整数
注意:假设整数只有1位
String str = "hello123";
for(int i=0; i < str.length(); i++) {
char c = str.charAt(i);
if(c >= '0' && c <= '9') {
// Code goes here
}
}
替代解决方案:
答案 3 :(得分:0)
你也可以避免使用.charAt(i)
,虽然它没有多大意义......只需从字符串中获取一个char
数组,然后使用索引{{1}进行循环}循环,在到达第一个数字时返回索引:
FOR
答案 4 :(得分:0)
如果我正确理解你的问题,那么你会有一堆字符后面跟着一堆整数。
您可以使用修改后的binary search来查找字符串中发生转换的点。如果您需要分析非常大的字符串,这应该是有用的。最差情况表现为O(log n)。
我在下面编写了一个例子:
alpha / n-1 + alpha
输出:
public class binSearch {
static int indexFinder(String s) {
// this doesn't check for invalid inputs btw
int beg = 0;
int end = s.length() - 1;
int mid;
int iter = 0;
while (beg < end) {
System.out.println("Iteration: " + iter + " String: " + s.substring(beg, end+1));
mid = (end + beg) / 2;
System.out.println("Mid: " + mid + " char: " + s.charAt(mid));
if (Character.isDigit(s.charAt(mid))) {
if (Character.isDigit(s.charAt(beg))) {
return beg;
}
end = mid;
} else {
beg = mid + 1;
}
iter++;
}
return beg;
}
public static void main(String[] args) {
System.out.println("Running");
String[] strings = {"joohhhnnnnnCEEENNAAAAAA123829898", "efi1029082198"};
for (String s : strings) {
StringBuilder check = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
check.append(i % 10);
}
System.out.println(s);
System.out.println(check.toString() + "\n");
System.out.println("First int index: " + indexFinder(s) + "\n\n");
}
}
}