A quick and easy way to join array elements with a separator (the opposite of split) in Java
参见相关的.NET问题
我正在寻找一种快速简便的方法来做与分裂完全相反的事情从而使
迭代数组需要添加一个条件(如果这不是最后一个元素,请添加分隔符)或使用子字符串删除最后一个分隔符。
我确信有一种经过认证的、有效的方法可以做到这一点(ApacheCommons?)
你喜欢在你的项目中做什么?
使用Java,你可以在我这8路:很洁净P></
1 |
本厂在三种:P></
1)directly元素specifying theP></
2)使用arraysP></
3)使用迭代量P></
如果你在线,你可以
喜欢谷歌的stringutils for this是collections过Apache的问题:P></
1 | Joiner.on(separator).join(array) |
compared stringutils has to the Joiner,在API设计和fluent is a位更多的柔性元素,例如
Apache Commons郎真的
for example:P></
不管一个人多,suspect that,as You拉提,there must be some kind of the actual前处理条件的子串?实现上述方法。P></
如果我做
快速和简单的解决方案不包括任何第三方。P></
1 2 3 4 5 6 7 8 9 |
"我认为there is to a注册,高效的方式做(Apache Commons?)"P></
是的,很显然地P></
1 | StringUtils.join(array, separator) |
http:/ / / / / www.java2s.com javaapi org.apache.commons.lang / stringutilsjoinobjectarraystringseparator.htm队列P></
你可以使用任何一easier arrays,知道你将得到的字符串with the values of the阵"、"separated byP></
我知道你会端上with this concat=":[ ] A、B、C"P></
更新P></
然后你可以使用get rid of the brackets和杰夫suggested模式的子字符串P></
1 | concat = concat.substring(1, concat.length() -1); |
我知道你端上与concat ="A、B、C"P></
用Java stringjoiner there is在1.8级我need for Apache Commons:番石榴。P></
1 |
directly with the collection或使用新的API流:P></
你可以使用正则表达式来替换?& replace with。P></
1 2 3 |
因为
在stripped version(fewer chars):P></
1 2 3 |
正则表达式是非常powerful,specially方法"和"replacefirst字符串替换?""。尝试给他们。P></
所有这些其他的答案,包括运行时的量。使用arraylist.tostring(类).replaceall which are甚wasteful(……)。P></
我会给你最优的算法与零量;它不漂亮面貌as as the other期权,but this is internally,他们是做什么的(piles of other隐检查后,多阵列配置和其他crud)。P></
因为你已经知道你是处理与保存的字符串,你可以帮of阵列分配模式表演的一切manually。这不是很漂亮,但如果你在the actual微量法自制by the other implementations,你会看到它has the possible运行量最小。P></
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public static String join(String separator, String ... values) { if (values.length==0)return"";//need at least one element //all string operations use a new array, so minimize all calls possible char[] sep = separator.toCharArray(); // determine final size and normalize nulls int totalSize = (values.length - 1) * sep.length;// separator size for (int i = 0; i < values.length; i++) { if (values[i] == null) values[i] =""; else totalSize += values[i].length(); } //exact size; no bounds checks or resizes char[] joined = new char[totalSize]; int pos = 0; //note, we are iterating all the elements except the last one for (int i = 0, end = values.length-1; i < end; i++) { System.arraycopy(values[i].toCharArray(), 0, joined, pos, values[i].length()); pos += values[i].length(); System.arraycopy(sep, 0, joined, pos, sep.length); pos += sep.length; } //now, add the last element; //this is why we checked values.length == 0 off the hop System.arraycopy(values[values.length-1].toCharArray(), 0, joined, pos, values[values.length-1].length()); return new String(joined); } |
这是快速和明确的选择:P></
1 2 3 4 5 6 7 8 9 10 11 12 |
这是在stringutils:P></
http:/ / / / / www.java2s.com javaapi org.apache.commons.lang / stringutilsjoinobjectarraystringseparator.htm队列P></
这永远是在方便的小功能。P></
1 2 3 4 5 6 7 8 | public static String join(String[] strings, int startIndex, String separator) { StringBuffer sb = new StringBuffer(); for (int i=startIndex; i < strings.length; i++) { if (i != startIndex) sb.append(separator); sb.append(strings[i]); } return sb.toString(); } |
我已经采取的方法已经从Java 1发展起来,以提供可读性,并保持与旧的Java版本向后兼容的合理选择,同时还提供了从Apache Mux-Lang-Langes中替换的方法签名。出于性能的原因,我可以看到使用数组的一些可能的异议。.aslist,但我更喜欢具有合理默认值的助手方法,而不复制执行实际工作的方法。这种方法为可靠方法提供了适当的入口点,该方法在调用之前不需要数组/列表转换。
Java版本兼容性的可能变体包括将StringBuffer(Java 1)替换为StringBuilder(Java 1.5),切换Java 1.5迭代器,并从集合(Java 1.2)中移除通用通配符(Java 1.5)。如果要进一步向后兼容一两步,请删除使用集合的方法,并将逻辑移到基于数组的方法中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public static String join(String[] values) { return join(values, ','); } public static String join(String[] values, char delimiter) { return join(Arrays.asList(values), String.valueOf(delimiter)); } // To match Apache commons-lang: StringUtils.join(values, delimiter) public static String join(String[] values, String delimiter) { return join(Arrays.asList(values), delimiter); } public static String join(Collection<?> values) { return join(values, ','); } public static String join(Collection<?> values, char delimiter) { return join(values, String.valueOf(delimiter)); } public static String join(Collection<?> values, String delimiter) { if (values == null) { return new String(); } StringBuffer strbuf = new StringBuffer(); boolean first = true; for (Object value : values) { if (!first) { strbuf.append(delimiter); } else { first = false; } strbuf.append(value.toString()); } return strbuf.toString(); } |
1 2 3 4 5 |