ArrayList'i bir dizeye dönüştürmenin en iyi yolu


353

Ben ArrayListtamamen bir dize olarak çıktı istiyorum bir var. Aslında toStringsekmelerle ayrılmış her öğenin kullanarak sırayla çıktı istiyorum . Bunu yapmanın hızlı bir yolu var mı? Eğer döngü (ya da her öğeyi kaldırmak) ve bir Dize bitiştirmek olabilir ama bu çok yavaş olacağını düşünüyorum.


4
veya her öğeyi kaldır Dikkatli olun, bir ArrayList listesinden öğeleri kaldırmak büyük bir NO-NO'dur, çünkü "döngü" öğelerin kayması nedeniyle karesel zaman alacaktır (ilk öğeden son öğeye döngü yapmanız koşuluyla).
Dimitry K

Yanıtlar:


329

Temel olarak, ArrayListtek seçenek üzerinde bir döngü kullanmak tek seçenektir:

Bu kodu KULLANMAYIN, neden istenmediğini ve bunun yerine hangi kodun kullanılması gerektiğini görmek için bu cevabın altına okumaya devam edin:

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

String listString = "";

for (String s : list)
{
    listString += s + "\t";
}

System.out.println(listString);

Aslında, javacderleyici dize birleştirmeyi yine de bir dizi appendişlem olarak optimize edeceğinden , bir dize birleştirmesi gayet iyi olacaktır StringBuilder. forYukarıdaki programdan bayt kodunun döngüden sökülmesinin bir kısmı :

   61:  new #13; //class java/lang/StringBuilder
   64:  dup
   65:  invokespecial   #14; //Method java/lang/StringBuilder."<init>":()V
   68:  aload_2
   69:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  aload   4
   74:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   77:  ldc #16; //String \t
   79:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   82:  invokevirtual   #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

Görüldüğü gibi, derleyici bu döngüyü a kullanarak optimize eder StringBuilder, bu nedenle performans büyük bir endişe olmamalıdır.

(Tamam, ikinci bakışta, StringBuilderdöngü her yinelemesinde somutlaştırılıyor, bu yüzden en verimli bayt kodu olmayabilir. Açık bir örnek oluşturmak ve kullanmak StringBuildermuhtemelen daha iyi performans sağlar.)

Aslında, herhangi bir çıktıya sahip olmanın (diske veya ekrana) en azından dize birleşimlerinin performansı hakkında endişelenmekten daha yavaş bir büyüklük sırası olacağını düşünüyorum.

Düzenleme: Yorumlarda belirtildiği gibi, yukarıdaki derleyici optimizasyonu gerçekten de StringBuilderher yinelemenin yeni bir örneğini yaratıyor . (Daha önce de belirttiğim gibi.)

Kullanılacak en optimize edilmiş teknik, Paul Tomblin'in yanıtıdır , çünkü sadece döngü StringBuilderdışında tek bir nesneyi başlatır for.

Yukarıdaki koda yeniden yazmak için:

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder();
for (String s : list)
{
    sb.append(s);
    sb.append("\t");
}

System.out.println(sb.toString());

StringBuilderDöngünün dışında yalnızca bir kez örnek oluşturur ve appendbu bayt kodunda ( StringBuilderdöngünün örneğini ve döngüyü gösterir) gösterildiği gibi, döngü içindeki yönteme yalnızca iki çağrı yapar :

   // Instantiation of the StringBuilder outside loop:
   33:  new #8; //class java/lang/StringBuilder
   36:  dup
   37:  invokespecial   #9; //Method java/lang/StringBuilder."<init>":()V
   40:  astore_2

   // [snip a few lines for initializing the loop]
   // Loading the StringBuilder inside the loop, then append:
   66:  aload_2
   67:  aload   4
   69:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  pop
   73:  aload_2
   74:  ldc #15; //String \t
   76:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   79:  pop

Bu nedenle, ilmenin içi fordaha kısa olduğundan ve StringBuilderher bir yinelemede bir somutlaştırmaya gerek olmadığından, el optimizasyonu daha iyi performans göstermelidir .


8
Performans nedeniyle yalnızca dize eklemek yerine StringBuilder sınıfı kullanmayı düşünün.
Jeremy

5
Derleyici dize birleştirmesini optimize eder, ancak döngü her yürütüldüğünde yeni bir StringBuilder nesnesi oluşturacaksınız.
Pedro Henriques

4
+ = Kullanımı için -1, bu durumda bir performans katilidir. Bir dizeye tekrar eklemek için her zaman StringBuilder kullanın.
starblue

10
Bu çözüm, özellikle virgülle ayrılmış bir liste veya benzeri oluşturmak istediğinizde, dizenin sonuna genellikle istenmeyen bir ekstra "\ t" ekler. Bence burada yayınlanan diğer çözümler, Apache Commons veya Guava kullanarak daha üstündür.
Peter Goetz

3
Bu en iyi cevap değil. Vitalii için Javaveya Geewax için aşağıya bakınAndroid
Gibolt

896

Java 8 veya sonraki sürümlerde:

String listString = String.join(", ", list);

Durumda listtürü String, bir birleştirme toplayıcı kullanılabilir değildir:

String listString = list.stream().map(Object::toString)
                        .collect(Collectors.joining(", "));

144
Java 8 kadar bunu eklemek inanamıyorum.
Paul

45
Bu cevap daha fazla oylanmalıdır! Kesmek yok, kütüphane yok, döngü yok.
Songo

4
bu OP'nin söylediklerinde işe yaramaz. String.join, tekrarlanabilir <? CharSequence> 'ı genişletir. Eğer ekrana istediğiniz bir listesi <String> var, ama List <MyObject> varsa eğer çalıştığını Yani değil OP tarafından istediği gibi onun içinde toString () çağrısı
Hilikus

3
Neden bu ilk (ve kabul edilmiş) cevap değil .. Ben orada olduğunu bilinceye kadar her zaman aşağı kaydırmak zorunda .. zarif ve özlü
Jack

2
Android API
26+

391

Bunu Android'de yapıyorsanız, bunun için TextUtils adı verilen güzel bir yardımcı program var .join(String delimiter, Iterable).

List<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
String joined = TextUtils.join(", ", list);

Açıkçası çok fazla Android dışında kullanmak, ama düşündüm ki bu konuya eklemek istiyorum ...


1
Yana TextUtils.joinbir sürer Object[], bunu aradığını varsayalım ediyorum toString()her belirteci üzerinde. Does PatientDetailsuygulamak toString()? Bu sorunu çözmezse, Separatorsınıfla bir şeyler yapmakta sıkışmış olabilirsiniz .
JJ Geewax

5
org.apache.lang3.StringUtilshemen hemen aynı şeyi yapıyor, bu yüzden cevabınız kesinlikle Android dışında bana çok faydalı oldu :)
Patrick

1
Bu cevabın popülerliği (şu anda en yüksek oyu alan), birçok java sorununun Android geliştirmeden kaynaklandığını gösteriyor
Amr H. Abd Elmajeed

1
Bahse girerim, sorunumu çözmek için bu Dünya'ya gönderildi :)
kofoworola

1
Hayatımı kurtardın. <3
Pratik Butani

234

Apache Commons Lang'ı indirin ve yöntemi kullanın

 StringUtils.join(list)

 StringUtils.join(list, ", ") // 2nd param is the separator.

Elbette kendiniz uygulayabilirsiniz, ancak kodları tamamen test edilmiştir ve muhtemelen mümkün olan en iyi uygulamadır.

Apache Commons kütüphanesinin büyük bir hayranıyım ve bunun Java Standart Kütüphanesine büyük bir katkı olduğunu düşünüyorum.


63
Ne yazık ki, SO sakinleri tekerleği yeniden icat etmeyi tercih ediyor.
skaffman

33
Ayrıca Apache Commons Lang'da. Kullanım şöyle görünecektirStringUtils.join(list.toArray(),"\t")
Muhd

33
Bu özel tekerlek ekstra bir bağımlılığa pek değmez.
Seva Alekseyev

25
@SevaAlekseyev Bence bu tartışmalı. Bu bağımlılığı hemen eklerseniz, sınıflarından çok daha sık yararlanacaksınız. "İf string! = Null && string.trim ()! =" "Yerine bunun yerine StringUtils.isNotEmpty ... kullanacaksınız, böylece her yerde null olup olmadığını kontrol etmek zorunda kalmayacaksınız. bu kütüphaneleri kullanmayı haklı kılan bir bağımlılığı beklerseniz, onları asla kullanamazsınız
Ravi Wallau

6
Sonunda ek bir sekme eklememesi de güzel!
keuleJ

139

Bu oldukça eski bir soru, ama daha modern bir cevap da ekleyebilirim - Guava'danJoiner sınıfı kullanın :

String joined = Joiner.on("\t").join(list);

2
Bu benim en sevdiğim çözüm. : -> guava için +1.
csgeek

Guava için de Ctrl + F'd. Teşekkürler!
Priidu Neemre

List <String> list = yeni ArrayList <String> (); list.add ( "Merhaba"); list.add ( "Hai"); list.add ( "Merhaba"); System.out.println (list.toString (). Substring (1, list.toString (). Length () - 1) .replaceAll (",", "\ t"));
Lova Chittumuri

86

Değişen Listesini okunabilir ve anlamlı etmek dize gerçekten her biri karşılaşabileceğinizi ortak bir sorudur.

Durum 1 . Sınıf yolunuzda (rogerdpack ve Ravi Wallau gibi) apache'nin StringUtils'i varsa:

import org.apache.commons.lang3.StringUtils;
String str = StringUtils.join(myList);

Durum 2 . Yalnızca JDK (7) 'nin yollarını kullanmak istiyorsanız:

import java.util.Arrays;
String str = Arrays.toString(myList.toArray()); 

Sadece kendi başınıza tekerlek yapmayın, bu tek satırlık görev için döngü kullanmayın.


1
Kendi durumumu göndermeden önce Case 2 çözümünüzü fark etmedim. Seninki aslında çok daha iyi ve ekstra adımı kurtarıyor. Kesinlikle ekstra araçlar gerektiren bazı cevaplar üzerinde tavsiye ederim.
Elliander

5
Arrays.toString(myList.toArray())- en kolay ve en basit çözüm
Ondrej Bozek

Bence bu en iyi ve en etkili çözüm olarak görülmeli
Morey

Arrays.toString(list.toArray())yazmak kolaydır, ancak son derece verimsizdir.
Matthieu

60

Hızlı bir tek astar arıyorsanız, Java 5'ten itibaren bunu yapabilirsiniz:

myList.toString().replaceAll("\\[|\\]", "").replaceAll(", ","\t")

Ayrıca, amacınız yalnızca içeriği yazdırmaksa ve "\ t" hakkında daha az endişeleniyorsanız, bunu yapmanız yeterlidir:

myList.toString()

hangi gibi bir dize döndürür

[str1, str2, str3]

Eğer bir Array (ArrayList değil) varsa, aynı şeyi şu şekilde yapabilirsiniz:

 Arrays.toString(myList).replaceAll("\\[|\\]", "").replaceAll(", ","\t")

3
Bunun aslında yayınlanan yöntemlerden daha verimli olduğunu düşünüyorum. Altta gösterilen böyle bir utanç. Zarif olmayabilir ama diğerlerinin teorik olarak O (n ^ 2) 'de çalıştığında çözümünüzün O (n) çalıştığına kesinlikle inanıyorum (Java Dizeleri değişmez olduğundan, temelde her birleştirme üzerinde yeni bir Dize oluşturursunuz ve sonuçlanan Dize büyür)
user3790827

Metniniz çok büyükse, bilgisayar kaynaklarınızı tüketirsiniz.
user3790827

Bu yöntem StringBuilder kullanmaktan 7-8 kat daha yavaştır.
Zoka

@ user3790827 Çok yüzeysel bir seviyeye bakıyorsunuz. Eyaletlerdeki şehirlerde mhanelerde bir kişiyi aramanızı söylersem , bunu söylerdiniz ya da , "bu ülkede bu kişiyi ara" demek için yeniden ifade edebilirim ve hemen bana söylerdiniz . Üstelik, buradaki tüm algoritmalar genellikle , bir döngü içinde döngü yoktur. nxO(mnx)O(n^3)O(n)O(n)
Jai

39

İçinden geçirin ve çağrı yapın. Sihirli bir yol yoktur ve eğer olsaydı, bunun altından geçmekten başka örtünün altında ne yapacağını düşünüyorsunuz? Tek mikro optimizasyon hakkında String yerine StringBuilder kullanmak olurdu ve bu bile büyük bir kazanç değil - dizeleri birleştirmek kapakların altında StringBuilder'e dönüşür, ancak en azından bu şekilde yazdığınızda neler olduğunu görebilirsiniz.

StringBuilder out = new StringBuilder();
for (Object o : list)
{
  out.append(o.toString());
  out.append("\t");
}
return out.toString();

Teşekkürler! Ben bitirmek budur :)
Juan Besa

4
Büyük diziler için bu kesinlikle mikro optimizasyon değildir. StringBuilder'ı kullanmak için otomatik dönüşüm, her dize birleştirme için ayrı olarak yapılır; bu, bir döngü durumunda yardımcı olmaz. Bir ifadede çok sayıda öğeyi birleştirirseniz sorun olmaz.
starblue

1
Eğer bitirme eğer StringBuilder açıkça kullanmak büyük bir anlaşma diyelim ki ~ 1 MB sonuç dizesi yapma 50.000 dizeleri - 1 s yürütme süresi ile karşılaştırıldığında 1 dakika bir fark olabilir.
Bay Napik

36

Çoğu Java projesinde genellikle apache-commons lang bulunur. StringUtils.join () yöntemleri çok güzel ve neredeyse her ihtiyacı karşılamak için çeşitli tatlar var.

public static java.lang.String join(java.util.Collection collection,
                                    char separator)


public static String join(Iterator iterator, String separator) {
    // handle null, zero and one elements before building a buffer 
    Object first = iterator.next();
    if (!iterator.hasNext()) {
        return ObjectUtils.toString(first);
    }
    // two or more elements 
    StringBuffer buf = 
        new StringBuffer(256); // Java default is 16, probably too small 
    if (first != null) {
        buf.append(first);
    }
    while (iterator.hasNext()) {
        if (separator != null) {
            buf.append(separator);
        }
        Object obj = iterator.next();
        if (obj != null) {
            buf.append(obj);
        }
    }
    return buf.toString();
}

Parametreler:

Toplamak - Bir araya getirilecek değerlerin boş olabilir

separator - kullanılacak ayırıcı karakter

İadeler : birleştirilmiş Dize, null yineleyici girdisi ise null

Bu tarihten beri: 2.3


2
join(...)Yöntemin hem diziler hem de koleksiyonlar için varyantları olduğu için bu çok hoş .
vikingsteve

Rastgele sayılarla, nadiren doldurulmuş öğelerden oluşan dizeler oluşturmam gerekiyordu. Sonunda bir dizeye değil, dizeye değil diziye ihtiyacım vardı. Bu benim kodum: Collections.shuffle (L); StringBuilder sb = new StringBuilder (); L. forEach (e -> sb. Ek (e)); sb.toString () işlevine dön;
dobrivoje


15

Bu basit kullanım durumunda, dizeleri virgülle birleştirebilirsiniz. Java 8 kullanıyorsanız:

String csv = String.join("\t", yourArray);

aksi takdirde commons-lang bir join () yöntemine sahiptir:

String csv = org.apache.commons.lang3.StringUtils.join(yourArray, "\t");

13

Sondaki ayırma karakterleriyle baş etmenin zarif bir yolu Sınıf Ayırıcı kullanmaktır

StringBuilder buf = new StringBuilder();
Separator sep = new Separator("\t");
for (String each: list) buf.append(sep).append(each);
String s = buf.toString();

Sınıf Ayırıcı'nın toString yöntemi , ilk çağrı hariç ayırıcıyı döndürür . Bu nedenle listeyi iz bırakmadan (veya bu durumda) önde gelen ayırıcılar olmadan yazdırırız.


8

Java 8'de bu basit. Tamsayıların listesi için örneğe bakın:

String result = Arrays.asList(1,2,3).stream().map(Object::toString).reduce((t, u) -> t + "\t" + u).orElse("");

Veya çok satırlı sürüm (daha kolay okunur):

String result = Arrays.asList(1,2,3).stream()
    .map(Object::toString)
    .reduce((t, u) -> t + "\t" + u)
    .orElse("");

Güncelleme - daha kısa bir versiyon

String result = Arrays.asList(1,2,3).stream()
                .map(Object::toString)
                .collect(Collectors.joining("\t"));

2
Bu sadece bir kod satırı olabilir, ama bana göre bu basit görünmüyor. Benim için Listeyi gezmek ve öğelerini Dize'ye ayrıştırmak bundan daha basit.
Bartzilla

1
Bu benim de ilk izlenimimdi. Ama alıştıktan sonra harika buluyorum. Örneğin, gibi işlemler ekleyebilirsiniz filter. Sonunda kodu okumak benim için çok daha kolay.
amra

3
Java 8'de: String.join ("\ t", dizi)
Tomasz

Son yorum yalnızca içerik bir Stringde olduğunda çalışır . Eğer onun bir listesi Integerbir sorun varsa
LeO

Bunların 3'ü android için API seviye 24 gerektirir.
Asad35Waheed

6

Her O(n)iki şekilde de bir algoritma (listeyi birden fazla alt listeye kırdığınız çok iş parçacıklı bir çözüm yapmadıysanız, ancak bunu istediğinizi sanmıyorum).

Sadece a'yı StringBuilderaşağıdaki gibi kullanın :

StringBuilder sb = new StringBuilder();

for (Object obj : list) {
  sb.append(obj.toString());
  sb.append("\t");
}

String finalString = sb.toString();

StringBuilderEğer yeniden başlatmasını bir olmayacak çünkü çok daha hızlı dizisi birleştirme daha olacak Stringher birleştirme nesneyi.


5

Android'de olmanız ve henüz Jack'i kullanmamanız durumunda (örneğin, Anında Çalıştırma için hala desteğe sahip olmadığı için) ve elde edilen dizenin biçimlendirmesi üzerinde daha fazla kontrol istiyorsanız (örneğin, yeni satır karakterini şu şekilde kullanmak istersiniz) öğelerin bölücüsü) ve StreamSupport kitaplığını (derleyici Java 7 veya önceki sürümlerinde akışları kullanmak için) kullanmak / kullanmak istiyorsanız, böyle bir şey kullanabilirsiniz (Bu yöntemi ListUtils sınıfıma koydum):

public static <T> String asString(List<T> list) {
    return StreamSupport.stream(list)
            .map(Object::toString)
            .collect(Collectors.joining("\n"));
}

Ve elbette, liste nesnelerinizin sınıfına toString () yöntemini uyguladığınızdan emin olun.


1
reduceString dizisi için kullanmak son derece verimsizdir. return StreamSupport.stream(list).map(Object::toString).collect(joining("\n"))Dahili olarak kullanılan Java 8 yolunu kullanmalısınız StringJoiner. Ayrıca bunu akış desteği ile yapamamanız için hiçbir neden yok .
Stefan Zobel

Başka bir şey, Optional#getboş bir listeden geçirilirse kodunuzun (nedeniyle ) korkunç bir şekilde başarısız olacağıdır .
Stefan Zobel

@StefanZobel Verimlilik ve uç durum konularına dikkat çektiğiniz için teşekkür ederiz. Kod değiştirildi.
Javad Sadeqzadeh

3

Son öğeden sonra son \ t istemiyorsanız, kontrol etmek için dizini kullanmanız gerekir, ancak listeler RandomAccess'i uyguladığında bunun yalnızca "çalıştığını" (yani O (n)) unutmayın.

List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder(list.size() * apprAvg); // every apprAvg > 1 is better than none
for (int i = 0; i < list.size(); i++) {
    sb.append(list.get(i));
    if (i < list.size() - 1) {
        sb.append("\t");
    }
}
System.out.println(sb.toString());

3

Aşağıdaki kod size yardımcı olabilir,

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
String str = list.toString();
System.out.println("Step-1 : " + str);
str = str.replaceAll("[\\[\\]]", "");
System.out.println("Step-2 : " + str);

Çıktı:

Step-1 : [1, 2, 3]
Step-2 : 1, 2, 3

3

En iyi yol değil, zarif yol olabilir.

Arrays.deepToString (Arrays.asList ("Test", "Test2")

import java.util.Arrays;

    public class Test {
        public static void main(String[] args) {
            System.out.println(Arrays.deepToString(Arrays.asList("Test", "Test2").toArray()));
        }
    }

Çıktı

[Test, Test2]


1
"En iyi" kod okunabilirliği anlamına gelir, bu en iyi yolu olduğunu düşünüyorum. Ben koda bakmadım, ama muhtemelen sadece özelleştirilebilir değil StringBuilder yöntemi (muhtemelen başlık altında bir StringBuilder kullanır) kadar verimli.
Mike Miller

3

Aşağıdakiler iyi olur:

List<String> streamValues = new ArrayList<>();
Arrays.deepToString(streamValues.toArray()));   

3

Eğer kullanıyorsanız Eclipse Koleksiyonlar kullanabileceğiniz makeString()yöntemi.

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

Assert.assertEquals(
    "one\ttwo\tthree",
    ArrayListAdapter.adapt(list).makeString("\t"));

İstemiyorsun, mutfakta annene dönüştürebilirsiniz Eğer ArrayListbir etmek FastList, bağdaştırıcı kurtulabilirsiniz.

Assert.assertEquals(
    "one\ttwo\tthree",
    FastList.newListWith("one", "two", "three").makeString("\t"));

Not: Eclipse Collections için bir komisyoncuyum.


3
List<String> stringList = getMyListOfStrings();
StringJoiner sj = new StringJoiner(" ");
stringList.stream().forEach(e -> sj.add(e));
String spaceSeparated = sj.toString()

new StringJoinerAyırıcı olarak kullanmak istediğiniz karakter dizisine geçersiniz . CSV yapmak istiyorsanız:new StringJoiner(", ");


3

Bir Satırda: [12,0,1,78,12] ila 12 0 1 78 12

String srt= list.toString().replaceAll("\\[|\\]|,","");

2
1) Artık böyle bir kod kullanmanın bir nedeni yok (4 yıl önce!). 2) Bu cevap Soru-Cevap bölümüne hiçbir şey eklemez.
Radiodef

Bu mükemmel çalışıyor. Virgülle ayrılmış dize için şunu kullanın: String srt = list.toString (). ReplaceAll ("\ [| \]", "");
Asad35Waheed

2

Println yerine sekmeleri kullanarak ayırmak için print

ArrayList<String> mylist = new ArrayList<String>();

mylist.add("C Programming");
mylist.add("Java");
mylist.add("C++");
mylist.add("Perl");
mylist.add("Python");

for (String each : mylist)
{       
    System.out.print(each);
    System.out.print("\t");
}

1

Ek kaynaklara bağlı olan birkaç örnek görüyorum, ancak en basit çözüm bu gibi görünüyor: .

    List<Account> accounts = new ArrayList<>();

   public String accountList() 
   {
      Account[] listingArray = accounts.toArray(new Account[accounts.size()]);
      String listingString = Arrays.toString(listingArray);
      return listingString;
   }

0

Bu şimdiye kadar oldukça eski bir konuşma ve apache müşterileri artık dahili olarak bir StringBuilder kullanıyor: http://commons.apache.org/lang/api/src-html/org/apache/commons/lang/StringUtils.html#line. 3045

Bu, bildiğimiz gibi performansı geliştirir, ancak performans kritikse, kullanılan yöntem biraz verimsiz olabilir. Arayüz esnektir ve farklı Koleksiyon türlerinde tutarlı davranışa izin verirken, orijinal sorudaki Koleksiyon türü olan Listeler için bir miktar verimsizdir.

Bunu, geleneksel bir döngüdeki unsurları basitçe yineleyerek önleyeceğimiz bir yük oluşturduğumuza dayandırıyorum. Bunun yerine, eşzamanlı modifikasyonları, yöntem çağrılarını vb. Kontrol eden sahne arkasında bazı ek şeyler olur.


0

Bunun için bir Regex kullanabilirsiniz. Bu olabildiğince özlü

System.out.println(yourArrayList.toString().replaceAll("\\[|\\]|[,][ ]","\t"));

-1

Bu fonksiyon hakkında:

public static String toString(final Collection<?> collection) {
    final StringBuilder sb = new StringBuilder("{");
    boolean isFirst = true;
    for (final Object object : collection) {
        if (!isFirst)
            sb.append(',');
        else
            isFirst = false;
        sb.append(object);
    }
    sb.append('}');
    return sb.toString();
}

her türlü koleksiyon için çalışır ...

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.