Saya ingin mencetak Stack<Integer>
objek sebaik debugger Eclipse (yaitu [1,2,3...]
) tetapi mencetaknya dengan out = "output:" + stack
tidak mengembalikan hasil yang bagus ini.
Hanya untuk memperjelas, saya berbicara tentang koleksi bawaan Java jadi saya tidak bisa menimpanya toString()
.
Bagaimana saya bisa mendapatkan versi tumpukan yang bisa dicetak?
java
debugging
pretty-print
Elazar Leibovich
sumber
sumber
AbstractCollection@toString
(dan dengan demikianString + Stack
) sudah mencetaknya seperti yang Anda inginkan.Jawaban:
Anda bisa mengonversinya menjadi sebuah array dan kemudian mencetaknya dengan
Arrays.toString(Object[])
:sumber
stack.toArray()
mungkin sangat mahal, cpu, waktu dan memori. Solusi yang diulang atas koleksi asli / iterable mungkin akan lebih sedikit memakan sumber daya.(Java 8)
sumber
yourCollection.stream().map( o -> o.toString() ).collect( joining(",") ))
lebih baik karena Anda membacanya dari kiri ke kanan, Anda tidak perlu melihat ke belakang untuk menghitung di otak Anda apa yang dilakukan dengan daftar perantaraDengan java 8 stream dan collector, hal itu dapat dilakukan dengan mudah:
pertama kita gunakan
map
denganObject::toString
untuk membuatCollection<String>
dan kemudian menggunakan bergabung dengan kolektor untuk bergabung setiap item dalam koleksi dengan,
sebagai pembatas.sumber
Collections.toString(stack)
akan mudah.Kelas MapUtils yang ditawarkan oleh proyek Apache Commons menawarkan
MapUtils.debugPrint
metode yang akan cukup mencetak peta Anda.sumber
System.out.println (Collection c) sudah mencetak semua jenis koleksi dalam format yang dapat dibaca. Hanya jika koleksi berisi objek yang ditentukan pengguna, maka Anda perlu menerapkan toString () di kelas yang ditentukan pengguna untuk menampilkan konten.
sumber
Menerapkan toString () di kelas.
Saya merekomendasikan Apache Commons ToStringBuilder untuk mempermudah ini. Dengan itu, Anda hanya perlu menulis metode semacam ini:
Untuk mendapatkan output seperti ini:
Ada juga implementasi yang reflektif .
sumber
Jambu terlihat seperti pilihan yang baik:
Iterables.toString(myIterable)
sumber
Saya setuju dengan komentar di atas tentang menimpa
toString()
kelas Anda sendiri (dan tentang mengotomatiskan proses itu sebanyak mungkin).Untuk kelas yang tidak Anda definisikan, Anda bisa menulis
ToStringHelper
kelas dengan metode kelebihan beban untuk setiap kelas perpustakaan yang ingin Anda tangani sesuai selera Anda:EDIT: Menanggapi komentar oleh xukxpvfzflbbld, inilah kemungkinan implementasi untuk kasus yang disebutkan sebelumnya.
Ini bukan implementasi penuh, tetapi hanya pemula.
sumber
Anda dapat menggunakan kelas "Objek" dari JAVA (yang tersedia sejak 1.7)
Output: 1273, 123, 876, 897
Kemungkinan lain adalah menggunakan "MoreObjects" dari Google Guave , yang menyediakan banyak fungsi pembantu yang bermanfaat:
Output: NameOfYourObject = [1273, 123, 876, 897]
Jambu docs
sumber
Objects.toString()
hanya memanggiltoString()
koleksi. Dalam contoh Anda, ini berfungsi karena mungkintoString()
pada koleksi yang didukung array terjadi cukup baik cetak.Dengan Apache Commons 3 , Anda ingin menelepon
sumber
Di Java8
atau
sumber
Hanya Memodifikasi contoh sebelumnya untuk mencetak koleksi genap yang berisi objek yang ditentukan pengguna.
sumber
sebagian besar koleksi memiliki manfaat
toString()
di java hari ini (Java7 / 8). Jadi tidak perlu melakukan operasi streaming untuk menggabungkan apa yang Anda butuhkan, cukup timpatoString
kelas nilai Anda dalam koleksi dan Anda mendapatkan apa yang Anda butuhkan.baik AbstractMap dan AbstractCollection menerapkan toString () dengan menelepon toString per elemen.
di bawah ini adalah testclass untuk menunjukkan perilaku.
sumber
JSON
Solusi alternatif dapat mengubah koleksi Anda dalam format JSON dan mencetak Json-String. Keuntungannya adalah Object-String yang diformat dengan baik dan mudah dibaca tanpa perlu mengimplementasikan
toString()
.Contoh menggunakan Google Gson :
sumber
Jika ini adalah kelas koleksi Anda sendiri daripada yang dibangun dalam satu, Anda perlu mengganti metode toString-nya. Eclipse memanggil fungsi itu untuk objek apa pun yang tidak memiliki format kabel.
sumber
Hati-hati saat memanggil Sop di Koleksi, itu bisa membuang
ConcurrentModification
Pengecualian. KarenatoString
metode internal setiap Koleksi secara internal memanggilIterator
Koleksi.sumber
Seharusnya berfungsi untuk koleksi apa pun kecuali
Map
, tetapi juga mudah didukung. Ubah kode untuk meneruskan 3 karakter ini sebagai argumen jika diperlukan.sumber
Anda dapat mencoba menggunakan
sumber
Ada dua cara untuk menyederhanakan pekerjaan Anda. 1. impor perpustakaan Gson. 2. gunakan Lombok.
Keduanya membantu Anda membuat String dari objek instance. Gson akan mem-parsing objek Anda, lombok akan menimpa objek kelas Anda dengan metode String.
Saya memberi contoh tentang Gson prettyPrint, saya membuat kelas pembantu untuk mencetak objek dan koleksi objek. Jika Anda menggunakan lombok, Anda dapat menandai kelas Anda sebagai @ToString dan mencetak objek Anda secara langsung.
}
sumber