@Test public void testNthIndexOf() { Object[][] tests = new Object[][]{ {"", "", -1}, {"", "", 0}, {"", "", 1}, {"", "", 2}, {"foo", "foo", 0}, {"foo", "foo", 1}, {"foo", "foo", 2}, {"foo", "foo", 3}, {"foo", "f", 0}, {"foo", "f", 1}, {"foo", "f", 2}, {"foo", "f", 3}, {"foo", "o", 0}, {"foo", "o", 1}, {"foo", "o", 2}, {"foo", "o", 3}, {"This is an example string", "a", 2}, {"This is an example string", "a", 3}, {"This is an example string", "i", 1}, {"This is an example string", "i", 2}, {"This is an example string", "i", 3}, {"This is an example string", "is", 1}, {"This is an example string", "is", 2}, {"aabbccddaabbccdd", "a", 1}, {"aabbccddaabbccdd", "a", 2}, {"aabbccddaabbccdd", "a", 3}, {"aabbccddaabbccdd", "a", 4}, {"aabbccddaabbccdd", "cd", 1}, {"aabbccddaabbccdd", "cd", 2}, {"aabbccddaabbccdd", "ccdd", 1}, {"aabbccddaabbccdd", "ccdd", 2},}; int[] indices = new int[]{ -1, -1, 0, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, 1, 2, -1, 13, -1, 2, 5, 22, 2, 5, 0, 1, 8, 9, 5, 13, 4, 12 }; assertEquals(tests.length, indices.length); for (int i = 0; i < tests.length; i++) { int index = StringUtils.nthIndexOf((String) tests[i][0], (String) tests[i][1], (Integer) tests[i][2]); assertEquals(String.format("%d-th occurrence of \"%s\" in \"%s\" should start at %d but started at %d", new Object[]{tests[i][2], tests[i][1], tests[i][0], indices[i], index}), index, indices[i]); } }
public static int nthIndexOf(String str, String substr, int n) { int pos = -1; while (n > 0) { if (pos >= str.length()) { return -1; } if ((pos = str.indexOf(substr, pos + 1)) == -1) { break; } n--; } return pos; }
StringUtils { public static int nthIndexOf(String str, String substr, int n) { int pos = -1; while (n > 0) { if (pos >= str.length()) { return -1; } if ((pos = str.indexOf(substr, pos + 1)) == -1) { break; } n--; } return pos; } }
StringUtils { public static int nthIndexOf(String str, String substr, int n) { int pos = -1; while (n > 0) { if (pos >= str.length()) { return -1; } if ((pos = str.indexOf(substr, pos + 1)) == -1) { break; } n--; } return pos; } private  StringUtils(); }
StringUtils { public static int nthIndexOf(String str, String substr, int n) { int pos = -1; while (n > 0) { if (pos >= str.length()) { return -1; } if ((pos = str.indexOf(substr, pos + 1)) == -1) { break; } n--; } return pos; } private  StringUtils(); static boolean isOnlyWhitespace(String str); static boolean isPossiblyJavaClass(String s); static String getReadableTime(long time_ms); static int nthIndexOf(String str, String substr, int n); static boolean startsWithFnameChars(String value); static boolean startsWithURIChars(String value); static int countURIEndingPushback(String value); static boolean isAlphanumeric(String str); static int patindexOf(String value, Pattern pattern); static boolean startsWithFpathChar(String value); static int countPushback(String capture, Pattern pat); static int whitespaceOrControlLength(String str, int off, boolean shouldMatch); }
StringUtils { public static int nthIndexOf(String str, String substr, int n) { int pos = -1; while (n > 0) { if (pos >= str.length()) { return -1; } if ((pos = str.indexOf(substr, pos + 1)) == -1) { break; } n--; } return pos; } private  StringUtils(); static boolean isOnlyWhitespace(String str); static boolean isPossiblyJavaClass(String s); static String getReadableTime(long time_ms); static int nthIndexOf(String str, String substr, int n); static boolean startsWithFnameChars(String value); static boolean startsWithURIChars(String value); static int countURIEndingPushback(String value); static boolean isAlphanumeric(String str); static int patindexOf(String value, Pattern pattern); static boolean startsWithFpathChar(String value); static int countPushback(String capture, Pattern pat); static int whitespaceOrControlLength(String str, int off, boolean shouldMatch); static final Pattern STANDARD_EOL; static final Pattern APOS_NO_BSESC; static final Pattern END_C_COMMENT; }