C#String.Format()和String.Join()的Java等价物
我知道这是一个新手问题,但在C#中的string操作是否等价于Java?
具体来说,我在谈论String.Format
和String.Join
。
Java String对象有一个format
方法(从1.5开始),但没有join
方法。
为了得到一堆尚未包含的有用的String实用方法,可以使用org.apache.commons.lang.StringUtils 。
String.format 。 至于join,你需要写你自己的:
static String join(Collection<?> s, String delimiter) { StringBuilder builder = new StringBuilder(); Iterator<?> iter = s.iterator(); while (iter.hasNext()) { builder.append(iter.next()); if (!iter.hasNext()) { break; } builder.append(delimiter); } return builder.toString(); }
番石榴来与Joiner
类 。
import com.google.common.base.Joiner; Joiner.on(separator).join(data);
从Java 8开始, join()
现在可以作为String类的两个类方法。 在这两种情况下,第一个参数是分隔符。
您可以传递单独的CharSequence
作为附加参数 :
String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium"); // "Antimony, Arsenic, Alumninum, Selenium"
或者你可以通过一个Iterable<? extends CharSequence>
Iterable<? extends CharSequence>
:
List<String> strings = new LinkedList<String>(); strings.add("EX"); strings.add("TER"); strings.add("MIN"); strings.add("ATE"); String joined = String.join("-", strings); // "EX-TER-MIN-ATE"
Java 8还增加了一个新的类StringJoiner
,你可以这样使用它:
StringJoiner joiner = new StringJoiner("&"); joiner.add("x=9"); joiner.add("y=5667.7"); joiner.add("z=-33.0"); String joined = joiner.toString(); // "x=9&y=5667.7&z=-33.0"
TextUtils.join可在Android上使用
您也可以使用string的可变参数,如下所示:
String join (String delim, String ... data) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.length; i++) { sb.append(data[i]); if (i >= data.length-1) {break;} sb.append(delim); } return sb.toString(); }
至于join,我相信这可能看起来不那么复杂:
public String join (Collection<String> c) { StringBuilder sb=new StringBuilder(); for(String s: c) sb.append(s); return sb.toString(); }
我不太喜欢使用Java 5语法(信不信由你,我最近一直在使用1.0.x),所以我可能有点生疏,但我确定这个概念是正确的。
编辑添加:string追加速度可能会很慢,但是如果您正在处理GUI代码或一些短期运行的例程,那么如果您花费0.005秒或.006秒,则确实无关紧要,因此如果您有一个名为“joinMe”的集合,你想追加到一个现有的string“目标”,这不会是可怕的只是内联:
for(String s : joinMe) target += s;
这是非常低效的(和一个坏习惯),但不是任何你能够感知,除非有成千上万的string,或者这是在一个巨大的循环内,或者你的代码真的是性能的关键。
更重要的是,它很容易记住,简短,快速和可读性强。 性能并不总是deviseselect的自动赢家。
这是一个非常简单的答案。 使用+=
因为代码less了,让优化器为你把它转换成一个StringBuilder
。 使用这种方法,您不必在循环中进行任何“最后”检查(性能改进),并且不必担心在最后剥离任何分隔符。
Iterator<String> iter = args.iterator(); output += iter.hasNext() ? iter.next() : ""; while (iter.hasNext()) { output += "," + iter.next(); }
我不想导入整个Apache库来添加一个简单的连接函数,所以这里是我的黑客。
public String join(String delim, List<String> destinations) { StringBuilder sb = new StringBuilder(); int delimLength = delim.length(); for (String s: destinations) { sb.append(s); sb.append(delim); } // we have appended the delimiter to the end // in the previous for-loop. Let's now remove it. if (sb.length() >= delimLength) { return sb.substring(0, sb.length() - delimLength); } else { return sb.toString(); } }
如果你想连接(连接)几个string到一个,你应该使用一个StringBuilder。 这比使用好得多
for(String s : joinMe) target += s;
由于StringBuilder不使用同步,所以还有一点胜过StringBuffer。
对于像这样的通用实用方法,在许多情况下(最终)会被调用很多次,所以应该使其高效,而不是分配许多瞬态对象。 我们已经分析了许多不同的Java应用程序,几乎总是发现string连接和string/ char []分配占用了大量的时间/内存。
我们的可重用集合 – > string方法首先计算所需结果的大小,然后创build一个具有该初始大小的StringBuilder; 这样避免了附加string时使用的内部char []的不必要的加倍/复制。
我写了自己的:
public static String join(Collection<String> col, String delim) { StringBuilder sb = new StringBuilder(); Iterator<String> iter = col.iterator(); if (iter.hasNext()) sb.append(iter.next().toString()); while (iter.hasNext()) { sb.append(delim); sb.append(iter.next().toString()); } return sb.toString(); }
但是JSP不支持Collection
,所以对于标签函数我写道:
public static String join(List<?> list, String delim) { int len = list.size(); if (len == 0) return ""; StringBuilder sb = new StringBuilder(list.get(0).toString()); for (int i = 1; i < len; i++) { sb.append(delim); sb.append(list.get(i).toString()); } return sb.toString(); }
并放到.tld
文件中:
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" <function> <name>join</name> <function-class>com.core.util.ReportUtil</function-class> <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature> </function> </taglib>
并在JSP文件中使用它:
<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%> ${funnyFmt:join(books, ", ")}
StringUtils是Apache Commons Lang库中相当有用的一个类。
有MessageFormat.format()
,它像C#的String.Format()
。
我在这里看到很多过于复杂的String.Join实现。 如果你没有Java 1.8,并且你不想导入一个新的库,下面的实现就足够了。
public String join(Collection<String> col, String delim) { StringBuilder sb = new StringBuilder(); for ( String s : col ) { if ( sb.length() != 0 ) sb.append(delim); sb.append(s); } return sb.toString(); }
ArrayList<Double> j=new ArrayList<>; j.add(1); j.add(.92); j.add(3); String ntop=j.toString(); //ntop= "[1, 0.92, 3]"
所以基本上,String ntop用逗号分隔符和括号来存储整个集合的值。
我只是使用string连接运算符“+”来join两个string。 s1 += s2;