diff --git a/src/main/java/ua/net/uid/utils/helpers/StringHelper.java b/src/main/java/ua/net/uid/utils/helpers/StringHelper.java index 2b9e512..db00296 100644 --- a/src/main/java/ua/net/uid/utils/helpers/StringHelper.java +++ b/src/main/java/ua/net/uid/utils/helpers/StringHelper.java @@ -18,6 +18,8 @@ import java.io.IOException; import java.util.Iterator; +import ua.net.uid.utils.iterators.ArrayIterator; + public class StringHelper { private static final char[] HEX_CHARS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; @@ -183,42 +185,57 @@ return offset; } - public static void join(Appendable builder, CharSequence div, Iterator iterator) throws IOException { - join(builder, div, iterator, true, true); - } - - public static void join(Appendable builder, CharSequence div, Iterator iterator, boolean skipEmpty) throws IOException { - join(builder, div, iterator, skipEmpty, skipEmpty); - } - - public static void join(Appendable builder, CharSequence div, Iterator iterator, boolean skipEmpty, boolean skipNull) throws IOException { + public static void joinTo(Appendable builder, CharSequence separator, Iterator iterator, CharSequence emptyAs, CharSequence nullAs) throws IOException { boolean first = true; while (iterator.hasNext()) { Object item = iterator.next(); - if (!skipNull || item != null) { - String str = String.valueOf(item); - if (!(skipEmpty && CommonHelper.isEmpty(str))) { - if (first) first = false; else builder.append(div); - builder.append(item.toString()); + if (item == null) { + if (nullAs != null) { + if (first) first = false; else builder.append(separator); + builder.append(nullAs); } + } else if (CommonHelper.isEmpty(item)) { + if (emptyAs != null) { + if (first) first = false; else builder.append(separator); + builder.append(emptyAs); + } + } else { + if (first) first = false; else builder.append(separator); + builder.append(item.toString()); } } } - public static CharSequence join(CharSequence div, Iterator iterator) { - return join(div, iterator, true, true); + public static void joinTo(Appendable builder, CharSequence separator, Iterator iterator, CharSequence emptyAs) throws IOException { + joinTo(builder, separator, iterator, emptyAs, emptyAs); } - public static CharSequence join(CharSequence div, Iterator iterator, boolean skipEmpty) { - return join(div, iterator, skipEmpty, skipEmpty); + public static void joinTo(Appendable builder, CharSequence separator, Iterator iterator) throws IOException { + joinTo(builder, separator, iterator, "", ""); } - public static CharSequence join(CharSequence div, Iterator iterator, boolean skipEmpty, boolean skipNull) { + public static void joinItemsTo(Appendable builder, CharSequence separator, Object ... items) throws IOException { + joinTo(builder, separator, new ArrayIterator(items), "", ""); + } + + public static CharSequence join(CharSequence separator, Iterator iterator, CharSequence emptyAs, CharSequence nullAs) { StringBuilder builder = new StringBuilder(); - try { join(builder, div, iterator, skipEmpty, skipNull); } catch (IOException ignore) {} + try { joinTo(builder, separator, iterator, emptyAs, nullAs); } catch (IOException ignore) {} return builder; } + public static CharSequence join(CharSequence separator, Iterator iterator, CharSequence emptyAs) { + return join(separator, iterator, emptyAs, emptyAs); + } + + public static CharSequence join(CharSequence separator, Iterator iterator) { + return join(separator, iterator, "", ""); + } + + public static CharSequence joinItems(CharSequence separator, Object ... items) { + return join(separator, new ArrayIterator(items), "", ""); + } + public static boolean isAscii(int chr) { return ((chr & 0xFFFFFF80) == 0); } @@ -234,4 +251,14 @@ public static boolean isAsciiDigit(int chr) { return chr >= '0' && chr <= '9'; } + + public static boolean isBlank(CharSequence str) { + if (!CommonHelper.isEmpty(str)) { + final int len = str.length(); + for (int i = 0; i < len; ++i) + if (!Character.isWhitespace(str.charAt(i))) + return false; + } + return true; + } } diff --git a/src/test/java/ua/net/uid/utils/helpers/StringHelperTest.java b/src/test/java/ua/net/uid/utils/helpers/StringHelperTest.java index 4ac9e70..7150511 100644 --- a/src/test/java/ua/net/uid/utils/helpers/StringHelperTest.java +++ b/src/test/java/ua/net/uid/utils/helpers/StringHelperTest.java @@ -4,6 +4,9 @@ import static org.junit.jupiter.api.Assertions.*; +import java.io.IOException; +import java.util.Arrays; + @SuppressWarnings("SpellCheckingInspection") class StringHelperTest { @@ -99,4 +102,85 @@ assertEquals(15, StringHelper.skipWhitespace(src, 15)); assertEquals(src.length(), StringHelper.skipWhitespace(src, 18)); } + + @Test + void testJoinToBuilderWithEmptyAndNull() throws IOException { + StringBuilder builder = new StringBuilder(); + Iterable src = Arrays.asList(1, 2, null, "q", "w", ""); + + StringHelper.joinTo(builder, ",", src.iterator(), "E", "N"); + assertEquals("1,2,N,q,w,E", builder.toString()); builder.setLength(0); + + StringHelper.joinTo(builder, ",", src.iterator(), "E", ""); + assertEquals("1,2,,q,w,E", builder.toString()); builder.setLength(0); + + StringHelper.joinTo(builder, ",", src.iterator(), "E", null); + assertEquals("1,2,q,w,E", builder.toString()); builder.setLength(0); + + StringHelper.joinTo(builder, ",", src.iterator(), "", "N"); + assertEquals("1,2,N,q,w,", builder.toString()); builder.setLength(0); + + StringHelper.joinTo(builder, ",", src.iterator(), null, "N"); + assertEquals("1,2,N,q,w", builder.toString()); builder.setLength(0); + } + + @Test + void testJoinToBuilderWithEmpty() throws IOException { + StringBuilder builder = new StringBuilder(); + Iterable src = Arrays.asList(1, 2, null, "q", "w", ""); + + StringHelper.joinTo(builder, ",", src.iterator(), "-"); + assertEquals("1,2,-,q,w,-", builder.toString()); builder.setLength(0); + + StringHelper.joinTo(builder, ",", src.iterator(), ""); + assertEquals("1,2,,q,w,", builder.toString()); builder.setLength(0); + + StringHelper.joinTo(builder, ",", src.iterator(), null); + assertEquals("1,2,q,w", builder.toString()); builder.setLength(0); + } + + @Test + void testJoinToBuilder() throws IOException { + StringBuilder builder = new StringBuilder(); + StringHelper.joinTo(builder, ",", Arrays.asList(1, 2, null, "q", "w", "").iterator()); + assertEquals("1,2,,q,w,", builder.toString()); builder.setLength(0); + } + + @Test + void testJoinItemsToBuilder() throws IOException { + StringBuilder builder = new StringBuilder(); + StringHelper.joinItemsTo(builder, ",", 1, 2, null, "q", "w", ""); + assertEquals("1,2,,q,w,", builder.toString()); builder.setLength(0); + } + + @Test + void testJoinWithEmptyAndNull() { + Iterable src = Arrays.asList(1, 2, null, "q", "w", ""); + assertEquals("1,2,N,q,w,E", StringHelper.join(",", src.iterator(), "E", "N").toString()); + assertEquals("1,2,,q,w,E", StringHelper.join(",", src.iterator(), "E", "").toString()); + assertEquals("1,2,q,w,E", StringHelper.join(",", src.iterator(), "E", null).toString()); + assertEquals("1,2,N,q,w,", StringHelper.join(",", src.iterator(), "", "N").toString()); + assertEquals("1,2,N,q,w", StringHelper.join(",", src.iterator(), null, "N").toString()); + } + + @Test + void testJoinWithEmpty() throws IOException { + Iterable src = Arrays.asList(1, 2, null, "q", "w", ""); + assertEquals("1,2,-,q,w,-", StringHelper.join(",", src.iterator(), "-").toString()); + assertEquals("1,2,,q,w,", StringHelper.join(",", src.iterator(), "").toString()); + assertEquals("1,2,q,w", StringHelper.join(",", src.iterator(), null).toString()); + } + + @Test + void testJoin() throws IOException { + Iterable src = Arrays.asList(1, 2, null, "q", "w", ""); + assertEquals("1,2,,q,w,", StringHelper.join(",", src.iterator()).toString()); + } + + @Test + void testJoinItems() throws IOException { + assertEquals("1,2,,q,w,", StringHelper.joinItems(",", 1, 2, null, "q", "w", "").toString()); + } + + }