LANG-1300: changed CharSequence lastIndexOf for Supplementary Characters
Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/b45435c9 Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/b45435c9 Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/b45435c9 Branch: refs/heads/master Commit: b45435c950e6f6864671bdffde29e26cdc8ce15b Parents: 12e597a Author: MarkDacek <mark.da...@richmond.edu> Authored: Wed Mar 8 23:18:10 2017 -0500 Committer: MarkDacek <mark.da...@richmond.edu> Committed: Wed Mar 8 23:18:10 2017 -0500 ---------------------------------------------------------------------- .../apache/commons/lang3/CharSequenceUtils.java | 26 ++++++++++++++------ .../lang3/StringUtilsEqualsIndexOfTest.java | 11 +++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-lang/blob/b45435c9/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java index cc39202..01cbca7 100644 --- a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java +++ b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java @@ -153,15 +153,25 @@ public class CharSequenceUtils { //NOTE - we must do a forward traversal for this to avoid duplicating code points if (searchChar <= Character.MAX_CODE_POINT) { char[] chars = Character.toChars(searchChar); - for (int i = start; i >= 0; --i) { - if (cs.charAt(i) == chars[0]) { - if (i + 1 == cs.length()) { - break; - } - if (cs.charAt(i + 1) == chars[1]) { - return i; - } + //make sure it's not the last index + if (start == sz - 1) { + return NOT_FOUND; + } + int maxInd = -1; + int ind = 0; + for (int i = 0; i < cs.length() - 1; i++) { + char high = cs.charAt(i); + char low = cs.charAt(i + 1); + if (chars[0] == high && chars[1] == low) { + maxInd = ind; + i++; + } else if (Character.isSurrogatePair(high, low)) { + i++; //skip over one } + ind++; + } + if (maxInd >= start) { + return maxInd; } } return NOT_FOUND; http://git-wip-us.apache.org/repos/asf/commons-lang/blob/b45435c9/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java b/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java index 8326061..701f022 100644 --- a/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java +++ b/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java @@ -545,11 +545,22 @@ public class StringUtilsEqualsIndexOfTest { StringBuilder builder = new StringBuilder(); builder.appendCodePoint(CODE_POINT); assertEquals(0, StringUtils.lastIndexOf(builder, CODE_POINT, 0)); + builder.appendCodePoint(CODE_POINT); + assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 0)); + assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 1)); + + + builder.append("aaaaa"); + assertEquals(-1, StringUtils.lastIndexOf(builder, CODE_POINT, 4)); //inner branch on the supplementary character block char[] tmp = {(char) 55361}; builder = new StringBuilder(); builder.append(tmp); assertEquals(-1, StringUtils.lastIndexOf(builder, CODE_POINT, 0)); + builder.appendCodePoint(CODE_POINT); + assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 0 )); + assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 1 )); + } @Test