Dizeler dizisini Java'da bir dizeye dönüştürme


242

Dizeleri bir dizeye dönüştürmek için Java kodu istiyorum.


Ne tür bir dizi? Dizi dizisi?
adarshr

2
array.toString()? Daha spesifik ol.
Stan Kurilin

1
@Princeyesuraj, resmi cevap adarshr tarafından verilir . Kendi ayırıcısını istiyorsanız, JoeSlav'ın yanıtını deneyebilirsiniz ve iş parçacığı sorunu yoksa, etkinlik için StringBuffer yerine StringBuilder kullanabilirsiniz . krock'un cevabı iyi, ama bence biraz abartılı .
Dante Mayıs

Yanıtlar:


470

Bir dizinin yalnızca "hata ayıklama stili" dökümünü istiyorsanız:

String str = Arrays.toString(arr);

veya daha fazla denetim için (Java 8'den önce):

StringBuilder builder = new StringBuilder();
for(String s : arr) {
    builder.append(s);
}
String str = builder.toString();

(Java 8 ve üstü):

String str = String.join(",", arr);

Ve Android açısından geliyorsanız:

String str = TextUtils.join(",", arr);

Dizeler arasında hangi karakterlerin (varsa) olmasını istediğinize bağlı olarak yukarıdakileri değiştirebilirsiniz.

Java 8 öncesi koduyla neredeyse aynı kodu görebilirsiniz, ancak StringBuffer- kullanımı StringBuilder, iş parçacığı için güvenli olmayan daha yeni bir sınıftır, bu nedenle tek bir iş parçacığında daha iyi performansa sahiptir, çünkü gereksiz senkronizasyondan uzaklaşır. Kısacası, StringBuildervakaların% 99'unda kullanmanız daha iyi - işlevsellik açısından, ikisi de aynı.

Bir dize KULLANMAYIN ve bazı cevapların burada gösterildiği gibi + = ile eklemeyin. Bu, GC'yi çatıdan gönderir, çünkü dizinizde öğeleriniz olduğu kadar dize nesnesi oluşturup atarsınız. Küçük diziler için farkı gerçekten fark etmeyebilirsiniz, ancak büyük diziler için daha yavaş büyüklük düzenleri olabilir.


13
StringBuilder'ın neden ekleme için + = 'den üstün olduğuna ilişkin açıklama için teşekkürler.
Nicholas Miller

5
Kapakların altında + = kullanırsanız, Java bunu StringBuilder kullanarak dönüştürür.
Javamann

6
@matteo, Kullanmak zorundasın Arrays.toString(yourArray);ama sanırım sen kullandınyourArray.toString();
Dzarafata

5
Java beri for-loop yerine 1.8kullanabilirsiniz String::join. String.join("", arr);
Jorn Vernee

2
Android geliştiricileri String String = TextUtils.join (",", list); stackoverflow.com/questions/33802971/…
Rahul Hawge

102

Apache ortaklarını kullanın StringUtils.join(). Bir diziyi parametre olarak alır (ve ayrıca aşırı yükleri Iterableve Iteratorparametreleri vardır) ve toString()her öğenin dize gösterimini almak için her öğeyi (boş değilse ) çağırır . Daha sonra her öğe dize temsili, belirtilirse aralarında bir ayırıcı bulunan bir dizeye birleştirilir:

String joinedString = StringUtils.join(new Object[]{"a", "b", 1}, "-");
System.out.println(joinedString);

üretir:

a-b-1

1
küçük düzeltme: joinString = StringUtils.join (yeni Nesne [] {"a", "b", "1"}, "-");
questborn

35

Bunun için Google'ın Guava Joiner'ı kullanmayı seviyorum , örneğin:

Joiner.on(", ").skipNulls().join("Harry", null, "Ron", "Hermione");

aynı dizeyi üretecekti:

new String("Harry, Ron, Hermione");

ETA: Java 8'in şu anda benzer desteği var:

String.join(", ", "Harry", "Ron", "Hermione");

Boş değerleri atlamak için destek göremiyorum, ancak bu kolayca çözülebilir.


10
Ama eğer komploya sadık nullolsaydık, "adı belirtilmemesi gereken kişi" olurdu :-)
Stephen C

22
Cesur iseniz: ;-)Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
zengin

Java-8String.join(", ", "Harry", null, "Ron", "Hermione").replaceAll("null", "Voldermart");
Cjo

13

Bir dizi ailkel tip verildiğinde bunu yapabilirsiniz :

StringBuffer result = new StringBuffer();
for (int i = 0; i < a.length; i++) {
   result.append( a[i] );
   //result.append( optional separator );
}
String mynewstring = result.toString();

23
StringBuffer eskidir, bunun yerine bir iş parçacığında kullanmak için gereksiz senkronizasyona sahip olmayan StringBuilder kullanın.
Jason S

13

Java 8'den, düşündüğüm en basit yol:

    String[] array = { "cat", "mouse" };
    String delimiter = "";
    String result = String.join(delimiter, array);

Bu şekilde isteğe bağlı bir sınırlayıcı seçebilirsiniz.


10

Arrays.deepToString yöntemini deneyin .

Belirtilen dizinin "derin içeriklerinin" dize ile temsil edilen halini döndürür. Dizi ögeler olarak başka diziler içeriyorsa, dize gösterimi içeriklerini içerir ve bu şekilde devam eder. Bu yöntem, çok boyutlu dizileri dizelere dönüştürmek için tasarlanmıştır


Çok fazla kontrole ihtiyacınız yoksa, bunun en basit çözüm olduğuna inanıyorum çünkü üçüncü taraf bir lib'e ihtiyacınız yok. İşte bir örnek: System.out.println (Arrays.deepToString (args));
neves

7

Arrays.toString aşırı yüklenmiş yöntemlerini deneyin .

Aksi takdirde, genel uygulamanın altında bunu deneyin:

public static void main(String... args) throws Exception {

    String[] array = {"ABC", "XYZ", "PQR"};

    System.out.println(new Test().join(array, ", "));
}

public <T> String join(T[] array, String cement) {
    StringBuilder builder = new StringBuilder();

    if(array == null || array.length == 0) {
        return null;
    }

    for (T t : array) {
        builder.append(t).append(cement);
    }

    builder.delete(builder.length() - cement.length(), builder.length());

    return builder.toString();
}

O zaman bize aradığınız formatı söyleyin. Aksi halde aklınızdakileri tahmin edemeyiz.
Jason S

3

Aşağıda Diziden Dizeye dönüşüm örneği verilmiştir.

    genel sınıf ArrayToString
    {
public static void main (Dize [] argümanları) { String [] strArray = yeni String [] {"Java", "PHP", ".NET", "PERL", "C", "COBOL"};

        String newString = Arrays.toString(strArray);

        newString = newString.substring(1, newString.length()-1);

        System.out.println("New New String: " + newString);
    }
}


1
String[] strings = new String[25000];
for (int i = 0; i < 25000; i++) strings[i] = '1234567';

String result;
result = "";
for (String s : strings) result += s;
//linear +: 5s

result = "";
for (String s : strings) result = result.concat(s);
//linear .concat: 2.5s

result = String.join("", strings);
//Java 8 .join: 3ms

Public String join(String delimiter, String[] s)
{
    int ls = s.length;
    switch (ls)
    {
        case 0: return "";
        case 1: return s[0];
        case 2: return s[0].concat(delimiter).concat(s[1]);
        default:
            int l1 = ls / 2;
            String[] s1 = Arrays.copyOfRange(s, 0, l1); 
            String[] s2 = Arrays.copyOfRange(s, l1, ls); 
            return join(delimiter, s1).concat(delimiter).concat(join(delimiter, s2));
    }
}
result = join("", strings);
// Divide&Conquer join: 7ms

Seçeneğiniz yoksa, Java 6 veya 7'yi kullanmak için Divide & Conquer birleştirmesini kullanmalısınız.


0

ArrayList öğesinden dize üreten kod istiyorsunuz,

Iterate through all elements in list and add it to your String result

bunu 2 şekilde yapabilirsiniz: sonuç olarak String veya StringBuffer / StringBuilder kullanma.

Misal:

String result = "";
for (String s : list) {
    result += s;
}

... ama performans nedeni nedeniyle bu iyi bir uygulama değil. Dizeleri eklemek için daha uygun olan StringBuffer (iş parçacığı güvenli) veya StringBuilder kullanmak daha iyidir



-1
String array[]={"one","two"};
String s="";

for(int i=0;i<array.length;i++)
{
  s=s+array[i];
}

System.out.print(s);

1
Cevabınız temel olarak şut ile aynı; sadece biraz daha karmaşık; böylece "en kolay" değil emin. Ayrıca, Arrays.toString () daha da kolaydır.
GhostCat

-22

Dizinin ne kadar öğeye sahip olduğunu biliyorsanız, bunu yapmanın basit bir yolu vardır:

String appendedString = "" + array[0] + "" + array[1] + "" + array[2] + "" + array[3]; 

10
Bu gerçek dünyada neredeyse hiç uygulanamaz ve bazı kötü programlama uygulamaları gösterir.
Jk1

3
-50 olumsuzluk elde etmek için harika bir altın madalya olabilir
Pablo Cegarra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.