Java等价的C#String.Format()和String.Join()

时间:2008-10-09 15:04:34

标签: c# java string

我知道这是一个新手问题,但在Java中C#的字符串操作是否相同?

具体来说,我说的是String.FormatString.Join

16 个答案:

答案 0 :(得分:91)

Java String对象具有format方法(从1.5开始),但没有join方法。

要获得一些尚未包含的有用的字符串实用程序方法,可以使用org.apache.commons.lang.StringUtils

答案 1 :(得分:46)

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();
 }

上述内容来自http://snippets.dzone.com/posts/show/91

答案 2 :(得分:38)

Guava附带the Joiner class

import com.google.common.base.Joiner;

Joiner.on(separator).join(data);

答案 3 :(得分:29)

从Java 8开始,join()现在可用作String类的两个类方法。在这两种情况下,第一个参数都是分隔符。

你可以pass individual CharSequences as additional arguments

String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"

或者你可以pass an 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"

答案 4 :(得分:17)

Android上可以使用

TextUtils.join

答案 5 :(得分:12)

您还可以对字符串使用变量参数,如下所示:

  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();
  }

答案 6 :(得分:4)

至于加入,我相信这可能看起来有点复杂:

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则无关紧要,因此如果您有一个名为你想要附加到现有字符串“target”的“joinMe”,只是内联这一点并不可怕:

for(String s : joinMe)
    target += s;

这是非常低效的(并且是一个坏习惯),但除非有数千个字符串或者这是在一个巨大的循环中或者你的代码确实对性能至关重要,否则你将无法感知任何东西。

更重要的是,它易于记忆,简短,快速且易读。性能并不总是设计选择的自动赢家。

答案 7 :(得分:4)

这是一个非常简单的答案。使用+=,因为代码较少,优化程序会将其转换为StringBuilder。使用这种方法,你不必做任何事情&#34;是最后一次&#34;检查你的循环(性能改进),你不必担心最后剥离任何分隔符。

        Iterator<String> iter = args.iterator();
        output += iter.hasNext() ? iter.next() : "";
        while (iter.hasNext()) {
            output += "," + iter.next();
        }

答案 8 :(得分:2)

我不想导入整个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();
        }
    }

答案 9 :(得分:1)

如果您希望将多个字符串连接(连接)为一个字符串,则应使用StringBuilder。它比使用

要好得多
for(String s : joinMe)
    target += s;

由于StringBuilder不使用同步,因此对StringBuffer的性能略有提升。

对于像这样的通用实用方法,它会(最终)在很多情况下被调用很多次,所以你应该使它高效并且不分配许多瞬态对象。我们已经分析了许多不同的Java应用程序,并且几乎总是发现字符串连接和字符串/ char []分配占用了大量的时间/内存。

我们的可重复使用的收藏品 - &gt; string方法首先计算所需结果的大小,然后创建一个具有该初始大小的StringBuilder;这避免了在附加字符串时使用的内部char []的不必要的加倍/复制。

答案 10 :(得分:1)

我自己写道:

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, ", ")}

答案 11 :(得分:0)

StringUtils是Apache Commons Lang库中非常有用的类。

答案 12 :(得分:0)

MessageFormat.format()就像C#的String.Format()一样。

答案 13 :(得分:0)

我在这里看到很多过于复杂的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();
}

答案 14 :(得分:-1)

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用逗号分隔符和括号存储整个集合的值。

答案 15 :(得分:-8)

我只想使用字符串连接运算符“+”来连接两个字符串。 s1 += s2;