我知道这是一个新手问题,但是Java中C#的字符串操作是否等效?
具体来说,我在谈论String.Format
和String.Join
。
我知道这是一个新手问题,但是Java中C#的字符串操作是否等效?
具体来说,我在谈论String.Format
和String.Join
。
Answers:
Java String对象有一个format
方法(从1.5开始),但没有join
方法。
要获得一堆尚未包含的有用的String实用程序方法,可以使用org.apache.commons.lang.StringUtils。
String.join()
方法。
String.format。至于加入,您需要编写自己的:
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();
}
从Java 8开始,join()
现在可以作为String类的两个类方法使用。在这两种情况下,第一个参数都是定界符。
String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"
或者您可以传递一个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上可用
至于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),所以我可能会有点生疏,但是我确信这个概念是正确的。
编辑附加:字符串追加可能会变慢,但是如果您使用的是GUI代码或某些运行时间较短的例程,那么花的时间是.005秒还是.006都没关系,因此,如果您有一个名为“ joinMe”的集合您想要附加到现有字符串“ target”上,只需内联它就不会太恐怖:
for(String s : joinMe)
target += s;
这是非常低效的(并且是一种不良习惯),但是除非有成千上万的字符串或者这在一个巨大的循环中或者您的代码确实对性能至关重要,否则您将无法感知到任何东西。
更重要的是,它易于记忆,简短,快速且易于阅读。性能并不一定总是设计选择中的自动赢家。
这是一个非常简单的答案。使用,+=
因为它的代码更少,让优化器StringBuilder
为您将其转换为。使用此方法,您不必在循环中进行任何“最后的检查”(提高性能),也不必担心最后会剥离任何分隔符。
Iterator<String> iter = args.iterator();
output += iter.hasNext() ? iter.next() : "";
while (iter.hasNext()) {
output += "," + iter.next();
}
我不想导入整个Apache库来添加简单的join函数,所以这是我的技巧。
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();
}
}
removeCharAt
不存在,整个函数不再返回一个字符串...会解决这个问题。
如果希望将多个字符串连接(合并)为一个,则应使用StringBuilder。它比使用好得多
for(String s : joinMe)
target += s;
由于StringBuilder不使用同步,因此在StringBuffer上还有一点性能上的优势。
对于这样的通用实用程序方法,最终(在许多情况下)将多次调用它,因此您应该使它高效,并且不要分配许多临时对象。我们已经剖析了许多许多不同的Java应用程序,并且几乎总是发现字符串连接和string / char []分配占用了大量的时间/内存。
我们可重用的collection-> string方法首先计算所需结果的大小,然后创建具有该初始大小的StringBuilder。这样可以避免在附加字符串时不必要地加倍/复制内部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();
}
但Collection
JSP不支持,因此对于标记功能,我写道:
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()
。
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用逗号分隔符和方括号存储整个集合的值。