Java: PHP join () gibi diziler için fonksiyon?

18 Cevap java

Ben bir tutkal dize ile bir String[] katılmak istiyorum. Bunun için bir işlevi var mı?

18 Cevap

Apache Commons Lang a StringUtils class which has a join function which will join arrays together to make a String vardır.

Örneğin:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

Aşağıdaki oluşturur String,

Hello, World, !

Böyle bir fonksiyon yazabiliriz:

String combine(String[] s, String glue)
{
  int k = s.length;
  if ( k == 0 )
  {
    return null;
  }
  StringBuilder out = new StringBuilder();
  out.append( s[0] );
  for ( int x=1; x < k; ++x )
  {
    out.append(glue).append(s[x]);
  }
  return out.toString();
}

Edit: Bunu ya bir dizi ya da dizeleri virgülle ayrılmış listesini geçebileceği böylece daha iyi bir imza, (String tutkal, String ... s) birleştirmek olabilir.

Yerine alt dize kullanarak küçük bir mod ():

//join(String array,delimiter)
public static String join(String r[],String d)
{
        if (r.length == 0) return "";
        StringBuilder sb = new StringBuilder();
        int i;
        for(i=0;i<r.length-1;i++)
            sb.append(r[i]+d);
        return sb.toString()+r[i];
}

Eğer android kullanmak için ne arıyor olsaydı, o:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

örneğin:

String joined = TextUtils.join(";", MyStringArray);

Google Guava kütüphane de var this kind of capability. Sen API de String [] örnek görebilirsiniz.

Zaten API de tarif edildiği gibi, güçlendirici yöntemlerin değişmezlik dikkat.

Bu durumda çalışmıyor, bu sayede nesneleri dizisi kabul edebilir. Benim önceki deneyim, ben bir iterable ve gayet iyi çalışıyor bir Stack katılmadan çalıştı.

Benden Örnek:

Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");

yazdırır: |i am a coder|

Eğer Spring Framework kullanıyorsanız o zaman StringUtils sınıf vardır:

import static org.springframework.util.StringUtils.arrayToDelimitedString;

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");

Değil çekirdek, hayır. Için bir arama size bu olsa nasıl ulaşılacağı konusunda bazı kod vereceğiz "java dizi dize tutkal katılın".

örneğin

public static String join(Collection s, String delimiter) {
    StringBuffer buffer = new StringBuffer();
    Iterator iter = s.iterator();
    while (iter.hasNext()) {
        buffer.append(iter.next());
        if (iter.hasNext()) {
            buffer.append(delimiter);
        }
    }
    return buffer.toString();
}

Verilen:

String[] a = new String[] { "Hello", "World", "!" };

Daha sonra bir yapıştırıcıdır cevabını, coobird alternatif olarak ",":

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

Ya da "&" gibi farklı bir dizeyle birleştirmek için.

Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")

Eğer dizi veya listedeki değerleri karakter dizesi "," içeren YAPMAYIN olduğunu biliyorum ... Ancak bu bir SADECE çalışır.

Bu bunu nasıl olduğunu.

private String join(String[] input, String delimiter)
{
    StringBuilder sb = new StringBuilder();
    for(String value : input)
    {
        sb.append(value);
        sb.append(delimiter);
    }
    int length = sb.length();
    if(length > 0)
    {
        // Remove the extra delimiter
        sb.setLength(length - delimiter.length());
    }
    return sb.toString();
}

Hiçbir şey dahili ben biliyorum.

Apache Commons Lang birçok işlevleri katılmak içerir StringUtils adında bir sınıfı vardır.

Sadece "I've the shortest one" meydan için, burada mayın vardır ;)

Iterative:

public static String join(String s, Object... a) {
    StringBuilder o = new StringBuilder();
    for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
        o.append(i.next()).append(i.hasNext() ? s : "");
    return o.toString();
}

Recursive:

public static String join(String s, Object... a) {
    return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}

Java'da 8 kullanabilirsiniz

1) Akış API:

String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));

2) yeni String.Join yöntemi: http://stackoverflow.com/a/21756398/466677

3) java.util.StringJoiner sınıfı: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html

Benzer bir alternatif

/**
 * @param delimiter 
 * @param inStr
 * @return String
 */
public static String join(String delimiter, String... inStr)
{
    StringBuilder sb = new StringBuilder();
    if (inStr.length > 0)
    {
        sb.append(inStr[0]);
        for (int i = 1; i < inStr.length; i++)
        {
            sb.append(delimiter);                   
            sb.append(inStr[i]);
        }
    }
    return sb.toString();
}

Eğer yolu yalnızca String sınıfının yöntemlerini kullanarak benim 3 satır sevdiniz mi?

static String join(String glue, String[] array) {
    String line = "";
    for (String s : array) line += s + glue;
    return (array.length == 0) ? line : line.substring(0, line.length() - glue.length());
}

Ben bunu bir StringBuilder kullanarak bu şekilde yapın:

public static String join(String[] source, String delimiter) {
    if ((null == source) || (source.length < 1)) {
        return "";
    }

    StringBuilder stringbuilder = new StringBuilder();
    for (String s : source) {
        stringbuilder.append(s + delimiter);
    }
    return stringbuilder.toString();
} // join((String[], String)

Ben çoğu kez kullanmak basit steno tekniği var ..

String op = new String;
for (int i : is) 
{
    op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);

java.util.Arrays bir 'asList' yöntemi vardır. Birlikte java.util.List / ArrayList API ile bu size ihtiyacınız olan tüm verir:;

private static String[] join(String[] array1, String[] array2) {

    List<String> list = new ArrayList<String>(Arrays.asList(array1));
    list.addAll(Arrays.asList(array2));
    return list.toArray(new String[0]);
}