Java String函数indexOf()可以查找多个字符吗?

时间:2016-09-21 16:15:16

标签: java string

我正在尝试减少我正在处理的程序的运行时间,并且我想找出一种更简单的方法来查找具有整数值的字符的索引。

目前,我的函数会跟踪字符串的每个字符,并返回它找到的第一个整数的索引。例如,如果我有字符串JohnCena1237728394712(是的,这是我想到的第一个字符串),该函数应该返回8,因为字符串中出现的第一个整数1是索引8。然而,首先在每个字符之前循环以找到该索引,并且有时会变得昂贵。

如果在尝试考虑更简单的方法时有帮助,我可以确定进入函数,字符串的格式将始终是“[letters]”+“[numbers]”所以我只是必须找到(可能是随机的)字母段的结尾才能得到我想要的东西。

我想要做的是使用indexOf()所以我不必使用循环,但我不知道如何使用该函数而不需要10个if语句(当然,这会打败目的)。

有没有办法在使用indexOf()或其他函数时一次检查多个整数?

5 个答案:

答案 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
    }
}

替代解决方案:

  • 对每个目标字符使用indexOf(),但其时间复杂度为O(n ^ 2)
  • 将一组目标整数存储在一个集合中,然后循环该字符串并检查字符是否在集合中(如果整数超过一位,这是好的)

答案 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");
        }
    }
}