web-dev-qa-db-ja.com

Java C#String.Format()およびString.Join()と同等)

私はこれがちょっとした初心者の質問であることを知っていますが、JavaでのC#の文字列操作に相当するものはありますか?

具体的には、String.FormatおよびString.Join

108
Omar Kooheji

Java Stringオブジェクトにはformatメソッドがあります(1.5以降)、ただしjoinメソッドはありません。

まだ含まれていない便利なStringユーティリティメソッドを取得するには、 org.Apache.commons.lang.StringUtils を使用できます。

91
Grant Wagner

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 からのものです

46
Allain Lalonde

Guava には Joinerクラス が付属しています。

import com.google.common.base.Joiner;

Joiner.on(separator).join(data);
38
Noel Yap

Java 8)の時点で、join()はStringクラスの2つのクラスメソッドとして使用できます。どちらの場合も、最初の引数は区切り文字です。

個々のCharSequencesを追加の引数として渡す

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"
29
qntm

TextUtils.join はAndroidで利用可能

17
Melllvar

次のように、文字列に変数引数を使用することもできます。

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

参加に関しては、これは少し複雑ではないように見えるかもしれません。

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;

それは非常に非効率的(そして悪い習慣)ですが、何千もの文字列があるか、これが巨大なループ内にあるか、コードが本当にパフォーマンスに重要でない限り、あなたが知覚できるものではありません。

さらに重要なことは、覚えやすく、短く、すばやく、読みやすいことです。デザインの選択において、パフォーマンスが常に自動勝者とは限りません。

4
Bill K

これは非常に簡単な答えです。つかいます +=これはコードが少ないため、オプティマイザがStringBuilderに変換できるようにします。この方法を使用すると、ループ内で「最後」のチェックを行う必要がなくなり(パフォーマンスの向上)、最後に区切り文字が削除されることを心配する必要がなくなります。

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

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

複数の文字列を1つに結合(連結)する場合は、StringBuilderを使用する必要があります。使用するよりもはるかに優れています

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

また、StringBuilderは同期を使用しないため、StringBufferよりもわずかにパフォーマンスが向上します。

このような汎用ユーティリティメソッドの場合、多くの状況で(最終的に)何回も呼び出されるため、効率的にし、多くの一時オブジェクトを割り当てないようにする必要があります。多くのさまざまなJavaアプリをプロファイルしましたが、ほとんどの場合、文字列の連結とstring/char []の割り当てはかなりの時間/メモリを消費します。

再利用可能なコレクション->文字列メソッドは、最初に必要な結果のサイズを計算してから、その初期サイズでStringBuilderを作成します。これにより、文字列を追加するときに使用される内部char []の不必要な2倍化/コピーが回避されます。

1
djb

私は自分で書きました:

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

StringUtils は、Apache Commons Langライブラリの非常に便利なクラスです。

0
Vishal

ここには、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();
}
0
Brandon Dutton

MessageFormat.format() があり、C#のString.Format()と同様に機能します。

0
MrSnowflake