C#String.Format()和String.Join()的Java等价物
本文关键字:Java 等价物 Join Format C#String String | 更新日期: 2023-09-27 17:48:52
我知道这是一个有点新手的问题,但在Java中有类似C#的字符串操作吗?
具体来说,我说的是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();
}
以上内容来自http://snippets.dzone.com/posts/show/91
Guava附带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>
:
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"
Java8还添加了一个新类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 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();
}
至于联接,我相信这看起来可能不那么复杂:
public String join (Collection<String> c) {
StringBuilder sb=new StringBuilder();
for(String s: c)
sb.append(s);
return sb.toString();
}
我没有像我想的那样使用Java5语法(信不信由你,我最近一直在使用1.0.x),所以我可能有点生疏,但我相信这个概念是正确的。
编辑附加:字符串附加可能很慢,但如果你正在处理GUI代码或一些短时间运行的例程,那么花0.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库来添加一个简单的联接函数,所以下面是我的破解方法。
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();
}
}
如果希望将多个字符串连接(连接)为一个字符串,则应使用StringBuilder。它比使用要好得多
for(String s : joinMe)
target += s;
与StringBuffer相比,还有一点性能优势,因为StringBuilder不使用同步。
对于像这样的通用实用程序方法,它将(最终)在许多情况下被调用多次,因此您应该使其高效,并且不要分配许多瞬态对象。我们已经分析了很多不同的Java应用程序,几乎总是发现字符串串联和string/char[]分配占用了大量的时间/内存。
我们的可重用集合->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();
}
但是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库中一个非常有用的类。
有一个类似C#的String.Format()
的MessageFormat.format()
。
我看到了很多过于复杂的String.Join的实现。如果您没有Java1.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]"
因此,基本上,Stringntop使用逗号分隔符和括号存储整个集合的值。
我只需要使用字符串串联运算符"+"来连接两个字符串。s1 += s2;