diff --git a/pom.xml b/pom.xml index aa117849a..2349b1482 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.baidu.hugegraph hugegraph-common - 1.6.8 + 1.6.9 hugegraph-common https://github.com/hugegraph/hugegraph-common @@ -212,7 +212,7 @@ - 1.6.8.0 + 1.6.9.0 diff --git a/src/main/java/com/baidu/hugegraph/util/StringUtil.java b/src/main/java/com/baidu/hugegraph/util/StringUtil.java index 8a2a72378..f7dcbb98a 100644 --- a/src/main/java/com/baidu/hugegraph/util/StringUtil.java +++ b/src/main/java/com/baidu/hugegraph/util/StringUtil.java @@ -19,22 +19,107 @@ package com.baidu.hugegraph.util; -import java.nio.CharBuffer; -import java.util.ArrayList; -import java.util.List; - public final class StringUtil { - public static List split(String line, String delimiter) { + public static Chars[] splitToCharsArray(String text, String delimiter) { E.checkArgument(delimiter.length() > 0, "The delimiter can't be empty"); - List results = new ArrayList<>(); - int from = 0; - for (int to; (to = line.indexOf(delimiter, from)) >= 0; - from = to + delimiter.length()) { - results.add(CharBuffer.wrap(line, from, to)); + Chars[] buffer = new Chars[text.length()]; + int count = Chars.split(text, delimiter, buffer); + if (count == buffer.length) { + return buffer; + } + Chars[] result = new Chars[count]; + System.arraycopy(buffer, 0, result, 0, count); + return result; + } + + public static String[] split(String text, String delimiter) { + E.checkArgument(delimiter.length() > 0, + "The delimiter can't be empty"); + Chars[] buffer = new Chars[text.length()]; + int count = Chars.split(text, delimiter, buffer); + String[] result = new String[count]; + for (int i = 0; i < count; i++) { + result[i] = buffer[i].toString(); + } + return result; + } + + public static class Chars implements CharSequence { + + private final char[] chars; + private final int start; + private final int end; + + public Chars(char[] chars, int start, int end) { + E.checkArgument(0 < start && start < chars.length || start == 0, + "Invalid start parameter %s", start); + E.checkArgument(start <= end && end <= chars.length, + "Invalid end parameter %s", end); + this.chars = chars; + this.start = start; + this.end = end; + } + + @Override + public int length() { + return this.end - this.start; + } + + @Override + public char charAt(int index) { + return this.chars[this.start + index]; + } + + @Override + public CharSequence subSequence(int start, int end) { + return new Chars(this.chars, this.start + start, this.start + end); + } + + @Override + public boolean equals(Object object) { + if (!(object instanceof Chars)) { + return false; + } + Chars other = (Chars) object; + return this.toString().equals(other.toString()); + } + + @Override + public int hashCode() { + return this.toString().hashCode(); + } + + @Override + public String toString() { + return new String(this.chars, this.start, this.length()); + } + + public static Chars of(String string) { + return new Chars(string.toCharArray(), 0, string.length()); + } + + public static Chars[] of(String... strings) { + Chars[] results = new Chars[strings.length]; + for (int i = 0; i < strings.length; i++) { + results[i] = Chars.of(strings[i]); + } + return results; + } + + public static int split(String text, String delimiter, Chars[] buffer) { + int count = 0; + int from = 0; + char[] chars = text.toCharArray(); + for (int to; (to = text.indexOf(delimiter, from)) >= 0; + from = to + delimiter.length()) { + buffer[count++] = new Chars(chars, from, to); + } + if (from < text.length()) { + buffer[count++] = new Chars(chars, from, text.length()); + } + return count; } - results.add(CharBuffer.wrap(line, from, line.length())); - return results; } } diff --git a/src/main/java/com/baidu/hugegraph/version/CommonVersion.java b/src/main/java/com/baidu/hugegraph/version/CommonVersion.java index 81c9333fd..5d166370c 100644 --- a/src/main/java/com/baidu/hugegraph/version/CommonVersion.java +++ b/src/main/java/com/baidu/hugegraph/version/CommonVersion.java @@ -27,5 +27,5 @@ public class CommonVersion { // The second parameter of Version.of() is for all-in-one JAR public static final Version VERSION = Version.of(CommonVersion.class, - "1.6.8"); + "1.6.9"); } diff --git a/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java b/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java index 629e986d5..e5f65d705 100644 --- a/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java +++ b/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java @@ -43,6 +43,7 @@ import com.baidu.hugegraph.unit.util.LongEncodingTest; import com.baidu.hugegraph.unit.util.NumericUtilTest; import com.baidu.hugegraph.unit.util.OrderLimitMapTest; import com.baidu.hugegraph.unit.util.ReflectionUtilTest; +import com.baidu.hugegraph.unit.util.StringUtilTest; import com.baidu.hugegraph.unit.util.TimeUtilTest; import com.baidu.hugegraph.unit.util.VersionUtilTest; import com.baidu.hugegraph.unit.version.VersionTest; @@ -69,6 +70,7 @@ import com.baidu.hugegraph.unit.version.VersionTest; InsertionOrderUtilTest.class, NumericUtilTest.class, ReflectionUtilTest.class, + StringUtilTest.class, TimeUtilTest.class, VersionUtilTest.class, LongEncodingTest.class, diff --git a/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java b/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java index 2c9fd4fc4..f37ba4171 100644 --- a/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java +++ b/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java @@ -26,12 +26,20 @@ import org.junit.Test; import com.baidu.hugegraph.testutil.Assert; import com.baidu.hugegraph.util.StringUtil; +import com.baidu.hugegraph.util.StringUtil.Chars; import com.google.common.base.Splitter; public class StringUtilTest { @Test public void testSplit() { + Assert.assertArrayEquals(new String[]{"1", "2", "3"}, + StringUtil.split("1, 2, 3", ", ")); + Assert.assertArrayEquals(new String[]{"1", "1", "1"}, + StringUtil.split("1 1 1", " ")); + Assert.assertArrayEquals(new String[]{"", "", ""}, + StringUtil.split("111", "1")); + Assert.assertEquals(guavaSplit("123", " "), toStringList(StringUtil.split("123", " "))); Assert.assertEquals(guavaSplit("1 2 3", " "), @@ -48,22 +56,41 @@ public class StringUtilTest { toStringList(StringUtil.split("1:|2|:3", "|"))); Assert.assertEquals(guavaSplit("1\t2\t3", "\t"), toStringList(StringUtil.split("1\t2\t3", "\t"))); - Assert.assertEquals(guavaSplit("111", "1"), - toStringList(StringUtil.split("111", "1"))); Assert.assertThrows(IllegalArgumentException.class, () -> { StringUtil.split("123", ""); }); } + @Test + public void testSplitToCharsArray() { + Assert.assertArrayEquals(Chars.of("1", "2", "3"), + StringUtil.splitToCharsArray("1, 2, 3", ", ")); + Assert.assertArrayEquals(Chars.of("1", "1", "1"), + StringUtil.splitToCharsArray("1 1 1", " ")); + Assert.assertArrayEquals(Chars.of("", "", ""), + StringUtil.splitToCharsArray("111", "1")); + + Assert.assertArrayEquals(new Chars[]{Chars.of("123")}, + StringUtil.splitToCharsArray("123", " ")); + Assert.assertArrayEquals(Chars.of("1", "", "2", "3"), + StringUtil.splitToCharsArray("1::2:3", ":")); + Assert.assertArrayEquals(Chars.of("1", "", "2", "", "3"), + StringUtil.splitToCharsArray("1::2::3", ":")); + + Assert.assertThrows(IllegalArgumentException.class, () -> { + StringUtil.splitToCharsArray("123", ""); + }); + } + private static List guavaSplit(String line, String delimiter) { return Splitter.on(delimiter).splitToList(line); } - private static List toStringList(List chars) { - List results = new ArrayList<>(chars.size()); - for (CharSequence seq : chars) { - results.add(seq.toString()); + private static List toStringList(String[] stringArray) { + List results = new ArrayList<>(stringArray.length); + for (String str : stringArray) { + results.add(str); } return results; }