From 50654f821f7fc9f70fe5525a92879f93c5fd9e67 Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 16 Nov 2021 01:19:40 +0800 Subject: [PATCH] fix code --- .../cn/hutool/core/text/CharSequenceUtil.java | 30 +++++-------------- .../hutool/core/text/finder/CharFinder.java | 16 +++++++--- .../core/text/finder/CharMatcherFinder.java | 16 +++++++--- .../hutool/core/text/finder/LengthFinder.java | 16 +++++++--- .../core/text/finder/PatternFinder.java | 7 ++++- .../cn/hutool/core/text/finder/StrFinder.java | 19 ++---------- .../hutool/core/text/finder/TextFinder.java | 17 +++++++++-- .../core/text/CharSequenceUtilTest.java | 19 +++++++++++- .../core/text/finder/CharFinderTest.java | 30 +++++++++++++++++++ 9 files changed, 115 insertions(+), 55 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/text/finder/CharFinderTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 71392a3a7..9a9d66a11 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -7,6 +7,7 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Filter; import cn.hutool.core.lang.Matcher; import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.text.finder.CharFinder; import cn.hutool.core.text.finder.Finder; import cn.hutool.core.text.finder.StrFinder; import cn.hutool.core.util.ArrayUtil; @@ -1066,7 +1067,7 @@ public class CharSequenceUtil { * @param searchChar 被查找的字符 * @return 位置 */ - public static int indexOf(final CharSequence str, char searchChar) { + public static int indexOf(CharSequence str, char searchChar) { return indexOf(str, searchChar, 0); } @@ -1089,33 +1090,17 @@ public class CharSequenceUtil { /** * 指定范围内查找指定字符 * - * @param str 字符串 + * @param text 字符串 * @param searchChar 被查找的字符 * @param start 起始位置,如果小于0,从0开始查找 * @param end 终止位置,如果超过str.length()则默认查找到字符串末尾 * @return 位置 */ - public static int indexOf(final CharSequence str, char searchChar, int start, int end) { - if (isEmpty(str)) { + public static int indexOf(CharSequence text, char searchChar, int start, int end) { + if (isEmpty(text)) { return INDEX_NOT_FOUND; } - final int len = str.length(); - if (start < 0 || start > len) { - start = 0; - } - if (end > len) { - end = len; - } - if (end < 0) { - end += len; - } - - for (int i = start; i < end; i++) { - if (str.charAt(i) == searchChar) { - return i; - } - } - return INDEX_NOT_FOUND; + return new CharFinder(searchChar).setText(text).setEndIndex(end).start(start); } /** @@ -1237,7 +1222,8 @@ public class CharSequenceUtil { return INDEX_NOT_FOUND; } } - return new StrFinder(searchStr, ignoreCase, true).setText(text).start(from); + return new StrFinder(searchStr, ignoreCase) + .setText(text).setNegative(true).start(from); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/CharFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/CharFinder.java index 358815c1a..4328581e1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/CharFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/CharFinder.java @@ -39,10 +39,18 @@ public class CharFinder extends TextFinder { @Override public int start(int from) { Assert.notNull(this.text, "Text to find must be not null!"); - final int limit = getValidEndIndex(false); - for (int i = from; i < limit; i++) { - if (NumberUtil.equals(c, text.charAt(i), caseInsensitive)) { - return i; + final int limit = getValidEndIndex(); + if(negative){ + for (int i = from; i > limit; i--) { + if (NumberUtil.equals(c, text.charAt(i), caseInsensitive)) { + return i; + } + } + } else{ + for (int i = from; i < limit; i++) { + if (NumberUtil.equals(c, text.charAt(i), caseInsensitive)) { + return i; + } } } return -1; diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java index 7f3537a7a..216d68ee7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/CharMatcherFinder.java @@ -26,10 +26,18 @@ public class CharMatcherFinder extends TextFinder { @Override public int start(int from) { Assert.notNull(this.text, "Text to find must be not null!"); - final int limit = getValidEndIndex(false); - for (int i = from; i < limit; i++) { - if(matcher.match(text.charAt(i))){ - return i; + final int limit = getValidEndIndex(); + if(negative){ + for (int i = from; i > limit; i--) { + if(matcher.match(text.charAt(i))){ + return i; + } + } + } else { + for (int i = from; i < limit; i++) { + if(matcher.match(text.charAt(i))){ + return i; + } } } return -1; diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/LengthFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/LengthFinder.java index 665d2438d..3face4f30 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/LengthFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/LengthFinder.java @@ -25,10 +25,18 @@ public class LengthFinder extends TextFinder { @Override public int start(int from) { Assert.notNull(this.text, "Text to find must be not null!"); - final int result = from + length; - final int limit = getValidEndIndex(false); - if(result < limit){ - return result; + final int limit = getValidEndIndex(); + int result; + if(negative){ + result = from - length; + if(result > limit){ + return result; + } + } else { + result = from + length; + if(result < limit){ + return result; + } } return -1; } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java index af0d3db57..92afc408d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java @@ -41,11 +41,16 @@ public class PatternFinder extends TextFinder { return super.setText(text); } + @Override + public TextFinder setNegative(boolean negative) { + throw new UnsupportedOperationException("Negative is invalid for Pattern!"); + } + @Override public int start(int from) { if (matcher.find(from)) { // 只有匹配到的字符串结尾在limit范围内,才算找到 - if(matcher.end() <= getValidEndIndex(false)){ + if(matcher.end() <= getValidEndIndex()){ return matcher.start(); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java index 2b11b0a15..edf931dde 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/StrFinder.java @@ -14,7 +14,6 @@ public class StrFinder extends TextFinder { private final CharSequence strToFind; private final boolean caseInsensitive; - private final boolean negative; /** * 构造 @@ -23,21 +22,9 @@ public class StrFinder extends TextFinder { * @param caseInsensitive 是否忽略大小写 */ public StrFinder(CharSequence strToFind, boolean caseInsensitive) { - this(strToFind, caseInsensitive, false); - } - - /** - * 构造 - * - * @param strToFind 被查找的字符串 - * @param caseInsensitive 是否忽略大小写 - * @param negative 是否从后向前查找模式 - */ - public StrFinder(CharSequence strToFind, boolean caseInsensitive, boolean negative ) { Assert.notEmpty(strToFind); this.strToFind = strToFind; this.caseInsensitive = caseInsensitive; - this.negative = negative ; } @Override @@ -48,15 +35,15 @@ public class StrFinder extends TextFinder { if (from < 0) { from = 0; } - int endLimit = getValidEndIndex(negative); - if(negative){ + int endLimit = getValidEndIndex(); + if (negative) { for (int i = from; i > endLimit; i--) { if (CharSequenceUtil.isSubEquals(text, i, strToFind, 0, subLen, caseInsensitive)) { return i; } } } else { - endLimit = endLimit - subLen + 1; + endLimit = endLimit - subLen + 1; for (int i = from; i < endLimit; i++) { if (CharSequenceUtil.isSubEquals(text, i, strToFind, 0, subLen, caseInsensitive)) { return i; diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/TextFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/TextFinder.java index 9b6f3d366..f2a5f9b91 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/TextFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/TextFinder.java @@ -15,6 +15,7 @@ public abstract class TextFinder implements Finder, Serializable { protected CharSequence text; protected int endIndex = -1; + protected boolean negative; /** * 设置被查找的文本 @@ -40,21 +41,31 @@ public abstract class TextFinder implements Finder, Serializable { return this; } + /** + * 设置是否反向查找,{@code true}表示从后向前查找 + * + * @param negative 结束位置(不包括) + * @return this + */ + public TextFinder setNegative(boolean negative) { + this.negative = negative; + return this; + } + /** * 获取有效结束位置
* 如果{@link #endIndex}小于0,在反向模式下是开头(-1),正向模式是结尾(text.length()) * - * @param negative 是否从后向前查找模式 * @return 有效结束位置 */ - protected int getValidEndIndex(boolean negative) { + protected int getValidEndIndex() { if(negative && -1 == endIndex){ // 反向查找模式下,-1表示0前面的位置,即字符串反向末尾的位置 return -1; } final int limit; if (endIndex < 0) { - limit = endIndex + text.length(); + limit = endIndex + text.length() + 1; } else { limit = Math.min(endIndex, text.length()); } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java index 85a35a18c..a8b1e53c1 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java @@ -47,5 +47,22 @@ public class CharSequenceUtilTest { Assert.assertEquals(str1, str2); } - // ------------------------------------------------------------------------ remove + @Test + public void indexOfTest(){ + int index = CharSequenceUtil.indexOf("abc123", '1'); + Assert.assertEquals(3, index); + index = CharSequenceUtil.indexOf("abc123", '3'); + Assert.assertEquals(5, index); + index = CharSequenceUtil.indexOf("abc123", 'a'); + Assert.assertEquals(0, index); + } + + @Test + public void indexOfTest2(){ + int index = CharSequenceUtil.indexOf("abc123", '1', 0, 3); + Assert.assertEquals(-1, index); + + index = CharSequenceUtil.indexOf("abc123", 'b', 0, 3); + Assert.assertEquals(1, index); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/finder/CharFinderTest.java b/hutool-core/src/test/java/cn/hutool/core/text/finder/CharFinderTest.java new file mode 100644 index 000000000..4a2cba983 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/text/finder/CharFinderTest.java @@ -0,0 +1,30 @@ +package cn.hutool.core.text.finder; + +import org.junit.Assert; +import org.junit.Test; + +public class CharFinderTest { + + @Test + public void startTest(){ + int start = new CharFinder('a').setText("cba123").start(2); + Assert.assertEquals(2, start); + + start = new CharFinder('c').setText("cba123").start(2); + Assert.assertEquals(-1, start); + + start = new CharFinder('3').setText("cba123").start(2); + Assert.assertEquals(5, start); + } + @Test + public void negativeStartTest(){ + int start = new CharFinder('a').setText("cba123").setNegative(true).start(2); + Assert.assertEquals(2, start); + + start = new CharFinder('2').setText("cba123").setNegative(true).start(2); + Assert.assertEquals(-1, start); + + start = new CharFinder('c').setText("cba123").setNegative(true).start(2); + Assert.assertEquals(0, start); + } +}