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

本文关键字:Java 等价物 Join Format C#String String | 更新日期: 2023-09-27 17:48:52

我知道这是一个有点新手的问题,但在Java中有类似C#的字符串操作吗?

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

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

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;