Cara terbaik untuk mengonversi ArrayList menjadi string

353

Saya punya ArrayListyang ingin saya hasilkan sepenuhnya sebagai String. Pada dasarnya saya ingin menampilkannya dengan menggunakan toStringmasing-masing elemen yang dipisahkan oleh tab. Apakah ada cara cepat untuk melakukan ini? Anda dapat mengulanginya (atau menghapus setiap elemen) dan menggabungkannya ke sebuah String tetapi saya pikir ini akan sangat lambat.

Juan Besa
sumber
4
atau hapus setiap elemen Hati-hati, menghapus elemen dari daftar ArrayList adalah TIDAK-TIDAK yang besar, karena "lingkaran" Anda akan membutuhkan waktu kuadratik karena elemen yang bergeser (asalkan Anda mengulang dari elemen pertama ke elemen terakhir).
Dimitry K
Sama untuk koleksi: stackoverflow.com/questions/395401/…
Ciro Santilli 郝海东 冠状 病 六四 事件 事件 法轮功

Jawaban:

329

Pada dasarnya, menggunakan loop untuk beralih di atas ArrayListadalah satu-satunya pilihan:

JANGAN gunakan kode ini, lanjutkan membaca di bagian bawah jawaban ini untuk melihat mengapa itu tidak diinginkan, dan kode mana yang harus digunakan sebagai gantinya:

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);

Bahkan, rangkaian string akan baik-baik saja, karena javackompiler akan mengoptimalkan rangkaian string sebagai serangkaian appendoperasi pada StringBuilderpokoknya. Berikut adalah bagian dari pembongkaran bytecode dari forloop dari program di atas:

   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;

Seperti yang dapat dilihat, kompiler mengoptimalkan loop itu dengan menggunakan StringBuilder, jadi kinerja seharusnya tidak menjadi perhatian besar.

(OK, pada pandangan kedua, StringBuildersedang dipakai pada setiap iterasi dari loop, jadi itu mungkin bukan bytecode paling efisien. Instantiating dan menggunakan eksplisit StringBuildermungkin akan menghasilkan kinerja yang lebih baik.)

Bahkan, saya berpikir bahwa memiliki segala jenis output (baik itu ke disk atau ke layar) akan setidaknya urutan besarnya lebih lambat daripada harus khawatir tentang kinerja rangkaian string.

Sunting: Seperti yang ditunjukkan dalam komentar, optimisasi kompiler di atas memang membuat contoh baru StringBuilderpada setiap iterasi. (Yang telah saya catat sebelumnya.)

Teknik yang paling optimal untuk digunakan akan menjadi respons oleh Paul Tomblin , karena hanya instantiate satu StringBuilderobjek di luar forloop.

Menulis ulang kode di atas ke:

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());

Hanya akan membuat instantiate di StringBuilderluar loop, dan hanya membuat dua panggilan ke appendmetode di dalam loop, seperti dibuktikan dalam bytecode ini (yang menunjukkan instantiation StringBuilderdan loop):

   // 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

Jadi, memang optimasi tangan harus berkinerja lebih baik, karena bagian dalam forloop lebih pendek dan tidak perlu instantiate StringBuilderpada setiap iterasi.

coobird
sumber
8
Pertimbangkan untuk menggunakan kelas StringBuilder alih-alih hanya menambahkan string, karena alasan kinerja.
Jeremy
5
Kompiler akan mengoptimalkan penggabungan string tetapi Anda akan membuat objek StringBuilder baru setiap kali loop dijalankan.
Pedro Henriques
4
-1 untuk penggunaan + =, dalam hal ini adalah pembunuh kinerja. Selalu gunakan StringBuilder untuk menambahkan berulang ke string.
starblue
10
Solusi ini menambahkan "\ t" tambahan di akhir string yang sering tidak diinginkan, terutama ketika Anda ingin membuat daftar yang dipisahkan koma atau serupa. Saya pikir solusi lain yang diposting di sini, menggunakan Apache Commons atau Guava, lebih unggul.
Peter Goetz
3
Ini bukan jawaban terbaik. Lihat di bawah ini di Vitalii for Javaatau Geewax forAndroid
Gibolt
895

Di Java 8 atau lebih baru:

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

Jika listbukan tipe String, kolektor gabungan dapat digunakan:

String listString = list.stream().map(Object::toString)
                        .collect(Collectors.joining(", "));
Vitalii Fedorenko
sumber
144
Saya tidak percaya butuh waktu sampai Java 8 untuk menambahkan ini.
Paul
45
Jawaban ini harus lebih banyak dipilih! Tanpa peretasan, tanpa perpustakaan & tanpa perulangan.
Songo
4
ini tidak bekerja untuk apa yang dikatakan OP. String.join mengambil argumen kedua Iterable <? memperluas CharSequence>. Jadi berfungsi jika Anda memiliki Daftar <String> yang ingin Anda tampilkan, tetapi jika Anda memiliki Daftar <MyObject> itu tidak akan memanggil toString () di dalamnya seperti yang diinginkan oleh OP
Hilikus
3
Kenapa ini bukan jawaban pertama (dan diterima) .. Saya selalu harus gulir ke bawah sampai saya tahu itu ada di sana .. elegan dan ringkas
Jack
2
Membutuhkan Android API 26+
Arsen Sench
391

Jika Anda kebetulan melakukan ini di Android, ada utilitas bagus untuk ini yang disebut TextUtils yang memiliki .join(String delimiter, Iterable)metode.

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

Jelas tidak banyak digunakan di luar Android, tetapi saya pikir saya akan menambahkannya ke utas ini ...

JJ Geewax
sumber
1
Sejak TextUtils.joinmengambil Object[], saya menganggap itu memanggil toString()setiap token. Apakah PatientDetailsmenerapkan toString()? Jika itu tidak menyelesaikan masalah, Anda mungkin terjebak melakukan sesuatu dengan Separatorkelas.
JJ Geewax
5
org.apache.lang3.StringUtilsmelakukan hal yang hampir sama, jadi jawaban Anda benar-benar bermanfaat bagi saya di luar Android :)
Patrick
1
Popularitas jawaban ini (saat ini merupakan yang tertinggi) menunjukkan kepada Anda bahwa banyak pertanyaan java berasal dari pengembangan Android
Amr H. Abd Elmajeed
1
Saya yakin Anda telah dikirim ke Bumi ini untuk menyelesaikan masalah saya :)
kofoworola
1
Kau telah menyelamatkan hidupku. <3
Pratik Butani
234

Unduh Apache Commons Lang dan gunakan metode ini

 StringUtils.join(list)

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

Anda dapat mengimplementasikannya sendiri, tentu saja, tetapi kode mereka sepenuhnya diuji dan mungkin merupakan implementasi terbaik.

Saya penggemar berat perpustakaan Apache Commons dan saya juga berpikir itu merupakan tambahan yang bagus untuk Java Standard Library.

Ravi Wallau
sumber
63
Sayangnya, para penghuni SO lebih suka menemukan kembali roda.
skaffman
33
Juga di Apache Commons Lang. Penggunaan akan terlihat sepertiStringUtils.join(list.toArray(),"\t")
Muhd
33
Roda khusus ini tidak sebanding dengan ketergantungan ekstra.
Seva Alekseyev
25
@SevaAlekseyev Saya pikir itu bisa diperdebatkan. Jika Anda menambahkan dependensi ini segera, Anda akan menggunakan kelasnya lebih sering daripada tidak. Alih-alih menggunakan "jika string! = Null && string.trim ()! =" "Anda akan menggunakan StringUtils.isNotEmpty ... Anda akan menggunakan ObjectUtils.equals () sehingga Anda tidak perlu memeriksa nol di mana-mana. jika Anda menunggu satu ketergantungan yang membenarkan menggunakan perpustakaan ini, Anda mungkin tidak akan pernah benar-benar menggunakannya
Ravi Wallau
6
Ini juga bagus karena tidak akan menambahkan tab tambahan di akhir!
keuleJ
139

Ini adalah pertanyaan yang cukup lama, tetapi saya pikir saya mungkin juga menambahkan jawaban yang lebih modern - gunakan Joinerkelas dari Guava :

String joined = Joiner.on("\t").join(list);
Jon Skeet
sumber
2
Ini solusi favorit saya. : -> +1 untuk jambu biji.
csgeek
Ctrl + F untuk Guava juga. Terima kasih!
Priidu Neemre
List <String> list = ArrayList baru <String> (); list.add ("Halo"); list.add ("Hai"); list.add ("Hai"); System.out.println (list.toString (). Substring (1, list.toString (). Length () - 1) .replaceAll (",", "\" "));
Lova Chittumuri
86

Mengubah Daftar menjadi String yang dapat dibaca dan bermakna adalah pertanyaan umum yang mungkin dihadapi setiap orang.

Kasus 1 . Jika Anda memiliki StringUtils apache di jalur kelas Anda (seperti dari rogerdpack dan Ravi Wallau):

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

Kasus 2 . Jika Anda hanya ingin menggunakan cara dari JDK (7):

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

Hanya tidak pernah membuat roda sendiri, jangan gunakan lingkaran untuk tugas satu baris ini.

Sheng
sumber
1
Saya tidak melihat solusi Kasus 2 Anda sebelum memposting sendiri. Milik Anda sebenarnya jauh lebih baik dan menyimpan langkah ekstra. Saya pasti akan merekomendasikan beberapa jawaban yang tampaknya memerlukan alat tambahan.
Elliander
5
Arrays.toString(myList.toArray())- solusi termudah dan paling mudah
Ondrej Bozek
Saya pikir ini harus dianggap sebagai solusi terbaik dan paling efisien
Morey
Arrays.toString(list.toArray())mudah untuk ditulis, tetapi sangat tidak efisien.
Matthieu
60

Jika Anda mencari one-liner cepat, pada Java 5 Anda dapat melakukan ini:

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

Selain itu, jika tujuan Anda hanya untuk mencetak konten dan kurang peduli tentang "\ t", Anda dapat melakukan ini:

myList.toString()

yang mengembalikan string seperti

[str1, str2, str3]

Jika Anda memiliki Array (bukan ArrayList) maka Anda dapat melakukan hal yang sama seperti ini:

 Arrays.toString(myList).replaceAll("\\[|\\]", "").replaceAll(", ","\t")
Ken Shih
sumber
3
Saya pikir ini sebenarnya lebih efisien daripada metode yang diposting di atas. Sayang sekali itu ditampilkan di bagian bawah. Mungkin tidak elegan tapi saya sangat percaya solusi Anda berjalan O (n) sementara yang lain secara teoritis berjalan di O (n ^ 2) (karena Java Strings tidak berubah Anda pada dasarnya membuat String baru pada setiap penggabungan, dan menjadi lebih buruk karena String yang dihasilkan menjadi lebih besar)
user3790827
Jika teks Anda sangat besar, Anda akhirnya memakan sumber daya komputer Anda.
user3790827
Metode ini 7-8 kali lebih lambat daripada menggunakan StringBuilder.
Zoka
@ user3790827 Anda sedang melihat level yang sangat dangkal. Jika saya memberitahu Anda untuk mencari seseorang di mrumah tangga di nkota-kota di xnegara bagian, Anda akan mengatakan itu O(mnx)atau O(n^3), tetapi saya dapat menguraikannya kembali dengan mengatakan "cari orang ini di negara ini," dan Anda akan segera memberi tahu saya O(n). Selain itu, semua algoritma di sini pada umumnya O(n), tidak ada perulangan di dalam satu lingkaran.
Jai
39

Loop melalui itu dan panggil toString. Tidak ada cara ajaib, dan jika ada, menurut Anda apa yang akan dilakukannya di balik selimut selain mengulanginya? Tentang satu-satunya optimasi mikro adalah menggunakan StringBuilder, bukan String, dan bahkan itu bukan kemenangan besar - string gabungan berubah menjadi StringBuilder di bawah selimut, tetapi setidaknya jika Anda menulisnya dengan cara itu Anda dapat melihat apa yang terjadi.

StringBuilder out = new StringBuilder();
for (Object o : list)
{
  out.append(o.toString());
  out.append("\t");
}
return out.toString();
Paul Tomblin
sumber
Terima kasih! inilah yang akhirnya saya lakukan :)
Juan Besa
4
Untuk array besar ini jelas bukan optimasi mikro. Konversi otomatis untuk menggunakan StringBuilder dilakukan secara terpisah untuk setiap rangkaian string, yang tidak membantu dalam kasus loop. Tidak masalah jika Anda menggabungkan banyak elemen dalam satu ekspresi.
starblue
1
Menggunakan StringBuilder secara eksplisit adalah masalah besar jika Anda menyambungkan katakanlah 50 000 string membuat ~ 1 MB string hasil - bisa jadi perbedaan 1 menit dibandingkan dengan waktu eksekusi 1 detik.
Tn. Napik
36

Sebagian besar proyek Java sering memiliki apache-commons lang tersedia. Metode StringUtils.join () sangat bagus dan memiliki beberapa rasa untuk memenuhi hampir setiap kebutuhan.

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

Parameter:

koleksi - Koleksi nilai untuk bergabung bersama, mungkin nol

separator - karakter pemisah yang digunakan

Pengembalian : String yang bergabung, input iterator nol jika nol

Sejak: 2.3

Brian
sumber
2
Ini sangat bagus karena join(...)metode ini memiliki varian untuk array dan koleksi.
vikingsteve
Saya perlu membuat koleksi string dengan elemen yang jarang diisi, dengan angka acak. Pada akhirnya saya membutuhkan string, bukan array bukan array ke string. Ini adalah kode saya: Collections.shuffle (L); StringBuilder sb = new StringBuilder (); L.forEach (e -> sb.append (e)); return sb.toString ();
dobrivoje
14

Untuk kasus penggunaan sederhana ini, Anda dapat dengan mudah menggabungkan string dengan koma. Jika Anda menggunakan Java 8:

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

jika tidak commons-lang memiliki metode join ():

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

Cara yang elegan untuk berurusan dengan karakter pemisahan yang tertinggal adalah dengan menggunakan Pemisah Kelas

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

Metode toString dari Class Separator mengembalikan separater, kecuali untuk panggilan pertama. Jadi kami mencetak daftar tanpa tertinggal (atau dalam hal ini) pemisah terkemuka.

akuhn
sumber
8

Di Java 8 itu sederhana. Lihat contoh untuk daftar bilangan bulat:

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

Atau versi multiline (yang lebih mudah dibaca):

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

Perbarui - versi yang lebih pendek

String result = Arrays.asList(1,2,3).stream()
                .map(Object::toString)
                .collect(Collectors.joining("\t"));
amra
sumber
2
Ini mungkin hanya sebaris kode, tetapi bagi saya itu tidak terlihat sederhana. Bagi saya melintasi Daftar dan mengurai elemen-elemennya ke dalam String lebih sederhana dari ini.
Bartzilla
1
Ini juga kesan pertama saya. Tetapi setelah saya terbiasa, saya merasa luar biasa. Misalnya, Anda dapat menambahkan operasi seperti filter. Pada akhirnya jauh lebih mudah bagi saya untuk membaca kodenya.
Amra
3
Di Java 8: String.join ("\ t", array)
Tomasz
Komentar terakhir hanya berfungsi jika kontennya Stringjuga. Jika ini adalah daftar Integers Anda memiliki masalah
LEO
Ketiganya membutuhkan API level 24 di android.
Asad35Waheed
6

Ini adalah O(n)algoritma yang baik (kecuali Anda melakukan beberapa solusi multi-threaded di mana Anda memecah daftar menjadi beberapa sublists, tapi saya tidak berpikir itu yang Anda minta).

Gunakan saja StringBuilderseperti di bawah ini:

StringBuilder sb = new StringBuilder();

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

String finalString = sb.toString();

The StringBuilderakan jauh lebih cepat daripada Rangkaian string karena Anda tidak akan kembali instantiating Stringobjek pada setiap rangkaian.

Mike C.
sumber
5

Jika Anda kebetulan menggunakan Android dan Anda belum menggunakan Jack (mis. Karena masih kurang dukungan untuk Instant Run), dan jika Anda ingin lebih mengontrol format string yang dihasilkan (mis. Anda ingin menggunakan karakter baris baru sebagai pembagi elemen), dan kebetulan menggunakan / ingin menggunakan pustaka StreamSupport (untuk menggunakan stream di Java 7 atau versi sebelumnya dari kompiler), Anda dapat menggunakan sesuatu seperti ini (saya meletakkan metode ini di kelas ListUtils saya):

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

Dan tentu saja, pastikan untuk mengimplementasikan toString () pada kelas objek daftar Anda.

Javad Sadeqzadeh
sumber
1
Penggunaannya reducesangat tidak efisien untuk penggabungan String. Anda harus melakukannya dengan cara Java 8 return StreamSupport.stream(list).map(Object::toString).collect(joining("\n"))yang digunakan secara internal StringJoiner. Tidak ada alasan Anda tidak dapat melakukan ini dengan dukungan streams juga.
Stefan Zobel
Hal lain adalah bahwa kode Anda akan gagal total (karena Optional#get) jika melewati daftar kosong.
Stefan Zobel
@StefanZobel Terima kasih telah menunjukkan efisiensi dan masalah kasus tepi. Memodifikasi kode.
Javad Sadeqzadeh
3

Jika Anda tidak ingin yang terakhir setelah elemen terakhir, Anda harus menggunakan indeks untuk memeriksa, tetapi ingat bahwa ini hanya "berfungsi" (yaitu O (n)) ketika daftar mengimplementasikan RandomAccess.

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());

sumber
3

Kode di bawah ini dapat membantu Anda,

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);

Keluaran:

Step-1 : [1, 2, 3]
Step-2 : 1, 2, 3
Srinivasan.S
sumber
3

Mungkin bukan cara terbaik, tapi cara yang elegan.

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

Keluaran

[Tes, Test2]

Mohan Narayanaswamy
sumber
1
Saya pikir ini adalah cara terbaik jika "terbaik" berarti pembacaan kode. Saya belum melihat kode, tapi mungkin seefisien metode StringBuilder (mungkin menggunakan StringBuilder di bawah tenda), meskipun tidak dapat dikustomisasi dalam output.
Mike Miller
3

Apakah yang berikut ini ada gunanya:

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

Jika Anda menggunakan Eclipse Collections , Anda dapat menggunakan makeString()metode ini.

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"));

Jika Anda dapat mengonversi ArrayListke FastList, Anda dapat menyingkirkan adaptor.

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

Catatan: Saya pengendara untuk Eclipse Collections.

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

Anda meneruskan ke new StringJoinerurutan char yang ingin Anda gunakan sebagai pemisah. Jika Anda ingin melakukan CSV:new StringJoiner(", ");

fmsf
sumber
3

Dalam satu Baris: Dari [12,0,1,78,12] menjadi 12 0 1 78 12

String srt= list.toString().replaceAll("\\[|\\]|,","");
Pratyush Pranjal
sumber
2
1) Tidak ada alasan lagi untuk menggunakan kode seperti ini (4 tahun yang lalu!). 2) Jawaban ini tidak menambahkan apa pun pada T&J.
Radiodef
5 bintang dalam satu baris. Terima kasih banyak.
Atef Farouk
Ini bekerja dengan sempurna. Untuk string yang dipisahkan koma, gunakan: String srt = list.toString (). ReplaceAll ("\ [| \]", "");
Asad35Waheed
2

Untuk memisahkan menggunakan tab daripada menggunakan println Anda dapat menggunakan 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");
}
daging
sumber
1

Saya melihat beberapa contoh yang tergantung pada sumber daya tambahan, tetapi sepertinya ini akan menjadi solusi paling sederhana: (yang saya gunakan dalam proyek saya sendiri) yang pada dasarnya hanya mengkonversi dari ArrayList ke Array dan kemudian ke Daftar .

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

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

Ini adalah percakapan yang cukup lama sekarang dan apache commons sekarang menggunakan StringBuilder secara internal: http://commons.apache.org/lang/api/src-html/org/apache/commons/lang/StringUtils.html#line. 3045

Ini akan seperti yang kita ketahui meningkatkan kinerja, tetapi jika kinerja sangat penting maka metode yang digunakan mungkin agak tidak efisien. Sedangkan antarmuka fleksibel dan akan memungkinkan untuk perilaku yang konsisten di berbagai jenis Koleksi itu agak tidak efisien untuk Daftar, yang merupakan jenis Koleksi dalam pertanyaan awal.

Saya mendasarkan ini di bahwa kita mengeluarkan beberapa overhead yang kita akan hindari dengan hanya mengulangi elemen-elemen dalam tradisional untuk loop. Sebaliknya ada beberapa hal tambahan yang terjadi di belakang layar memeriksa modifikasi bersamaan, panggilan metode dll. Peningkatan loop akan di sisi lain menghasilkan overhead yang sama karena iterator digunakan pada objek Iterable (Daftar).

Alex VI
sumber
0

Anda dapat menggunakan Regex untuk ini. Ini singkat seperti yang didapat

System.out.println(yourArrayList.toString().replaceAll("\\[|\\]|[,][ ]","\t"));
Vikrant Goel
sumber
-1

Bagaimana dengan fungsi ini:

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

ini bekerja untuk semua jenis koleksi ...

pengembang android
sumber