Apakah ada kelas perpustakaan Java standar untuk mewakili pohon di Jawa?
Secara khusus saya perlu mewakili yang berikut:
- Sub-pohon di sembarang simpul dapat memiliki jumlah anak yang berubah-ubah
- Setiap node (setelah root) dan anak-anak itu akan memiliki nilai string
- Saya perlu mendapatkan semua anak-anak (semacam daftar atau array dari Strings) dari suatu simpul dan nilai string-nya (yaitu metode yang akan mengambil simpul sebagai input dan mengembalikan semua nilai string dari simpul anak-anak sebagai output)
Apakah ada struktur yang tersedia untuk ini atau apakah saya perlu membuat sendiri (jika demikian saran implementasi akan bagus).
Jawaban:
Sini:
Itu adalah struktur pohon dasar yang dapat digunakan untuk
String
atau objek lain. Cukup mudah untuk menerapkan pohon sederhana untuk melakukan apa yang Anda butuhkan.Yang perlu Anda tambahkan adalah metode untuk menambahkan, menghapus dari, melintasi, dan konstruktor. Ini
Node
adalah blok bangunan dasarTree
.sumber
Tree
kelas tidak perlu, karena setiap orangNode
dapat dengan sendirinya dilihat sebagai pohon.Namun struktur pohon lain:
Penggunaan sampel:
BONUS
Lihat pohon lengkap dengan:
https://github.com/gt4dev/yet-another-tree-structure
sumber
hasNext()
sebelum setiap panggilannext()
untuk mendapatkan hasil yang valid. Ini bukan bagian dariIterator
spesifikasi.Sebenarnya ada struktur pohon yang cukup bagus diimplementasikan di JDK.
Lihatlah javax.swing.tree , TreeModel , dan TreeNode . Mereka dirancang untuk digunakan dengan
JTreePanel
tetapi mereka, pada kenyataannya, implementasi pohon yang cukup bagus dan tidak ada yang menghentikan Anda dari menggunakannya tanpa antarmuka ayunan.Perhatikan bahwa pada Java 9 Anda mungkin ingin tidak menggunakan kelas-kelas ini karena mereka tidak akan hadir di 'Profil ringkas' .
sumber
Bagaimana dengan ini?
sumber
setAsParent
ataugetHead
lakukan dan ini adalah waktu ketika saya benar-benar bisa mendapatkan bantuan pada struktur data pohon. Bahkan sumber asli dokumen tidak memiliki komentar.Saya menulis perpustakaan kecil yang menangani pohon generik. Ini jauh lebih ringan dari pada ayunan. Saya juga punya proyek pakar untuk itu.
sumber
Jelas Anda dapat menambahkan metode utilitas untuk menambah / menghapus anak-anak.
sumber
Anda harus mulai dengan mendefinisikan pohon apa (untuk domain), ini paling baik dilakukan dengan mendefinisikan antarmuka terlebih dahulu. Tidak semua struktur pohon dapat dimodifikasi, dapat menambah dan menghapus node harus menjadi fitur opsional, jadi kami membuat antarmuka tambahan untuk itu.
Tidak perlu membuat objek node yang memegang nilai , pada kenyataannya saya melihat ini sebagai cacat desain utama dan overhead di sebagian besar implementasi pohon. Jika Anda melihat Swing,
TreeModel
bebas dari kelas simpul (hanyaDefaultTreeModel
memanfaatkanTreeNode
), karena mereka tidak benar-benar diperlukan.Struktur pohon yang dapat diubah (memungkinkan untuk menambah dan menghapus node):
Dengan adanya antarmuka ini, kode yang menggunakan tree tidak harus terlalu peduli tentang bagaimana tree diimplementasikan. Ini memungkinkan Anda untuk menggunakan implementasi generik serta yang khusus , di mana Anda menyadari pohon dengan mendelegasikan fungsi ke API lain.
Contoh: struktur pohon file
Contoh: struktur pohon generik (berdasarkan hubungan orang tua / anak):
sumber
Tidak ada jawaban yang menyebutkan kode yang terlalu disederhanakan tetapi berfungsi, jadi ini dia:
sumber
Anda dapat menggunakan API XML apa pun dari Java sebagai Dokumen dan Node..sebagai XML adalah struktur pohon dengan Strings
sumber
Jika Anda melakukan pengkodean papan tulis, wawancara, atau bahkan hanya berencana untuk menggunakan pohon, verbositas semua ini sedikit banyak.
Lebih lanjut harus dikatakan bahwa alasan pohon tidak ada di sana seperti, katakanlah a
Pair
(tentang hal yang sama dapat dikatakan), adalah karena Anda harus merangkum data Anda di kelas menggunakannya, dan implementasi paling sederhana terlihat seperti:Itu benar-benar untuk pohon lebar yang sewenang-wenang.
Jika Anda menginginkan pohon biner, seringkali lebih mudah digunakan dengan bidang bernama:
Atau jika Anda menginginkan trie:
Sekarang kamu bilang mau
Kedengarannya seperti pekerjaan rumah Anda.
Tapi karena saya cukup yakin tenggat waktu sekarang telah berlalu ...
Ini bisa Anda gunakan seperti:
sumber
Sepanjang baris yang sama dengan jawaban Gareth, periksa DefaultMutableTreeNode . Itu tidak generik, tetapi sebaliknya tampaknya sesuai dengan tagihan. Meskipun ada dalam paket javax.swing, itu tidak tergantung pada kelas AWT atau Swing. Sebenarnya, kode sumber sebenarnya memiliki komentar
// ISSUE: this class depends on nothing in AWT -- move to java.util?
sumber
Ada beberapa struktur data pohon di Jawa, seperti DefaultMutableTreeNode di JDK Swing, paket parser Tree in Stanford, dan kode mainan lainnya. Tetapi tidak ada yang cukup namun cukup kecil untuk tujuan umum.
Proyek Java-tree mencoba untuk menyediakan struktur data pohon tujuan umum lainnya di Jawa. Perbedaan antara ini dan yang lainnya adalah
sumber
Karena pertanyaannya menanyakan struktur data yang tersedia, pohon dapat dibangun dari daftar atau array:
instanceof
dapat digunakan untuk menentukan apakah suatu elemen subtree atau terminal node.sumber
Object
s akan baik menjadi obyek daun (misalnya,String
s) atau cabang (diwakili oleh array). Dan itu berhasil: kode itu akan dikompilasi, dan itu menciptakan pohon kecilString
s.Sesederhana dan sangat mudah digunakan. Untuk menggunakannya, perluas:
sumber
Sebagai contoh :
sumber
Di masa lalu saya baru saja menggunakan peta bersarang untuk ini. Inilah yang saya gunakan hari ini, sangat sederhana tetapi sesuai dengan kebutuhan saya. Mungkin ini akan membantu yang lain.
sumber
Saya menulis kelas "TreeMap" kecil berdasarkan "HashMap" yang mendukung penambahan jalur:
Dapat digunakan untuk menyimpan Tree of type "T" (generic), tetapi tidak (belum) mendukung penyimpanan data tambahan di node-node itu. Jika Anda memiliki file seperti ini:
Kemudian Anda bisa menjadikannya pohon dengan mengeksekusi:
Dan Anda akan mendapatkan pohon yang bagus. Seharusnya mudah beradaptasi dengan kebutuhan Anda.
sumber
Anda dapat menggunakan kelas HashTree yang termasuk dalam Apache JMeter yang merupakan bagian dari Proyek Jakarta.
Kelas HashTree termasuk dalam paket org.apache.jorphan.collections. Meskipun paket ini tidak dirilis di luar proyek JMeter, Anda bisa mendapatkannya dengan mudah:
1) Unduh sumber JMeter .
2) Buat paket baru.
3) Salin di atasnya / src / jorphan / org / apache / jorphan / koleksi /. Semua file kecuali Data.java
4) Salin juga /src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
5) HashTree siap digunakan.
sumber
Tidak ada struktur data khusus di Jawa yang sesuai dengan kebutuhan Anda. Persyaratan Anda cukup spesifik dan untuk itu Anda perlu merancang struktur data Anda sendiri. Melihat persyaratan Anda, siapa pun dapat mengatakan bahwa Anda memerlukan semacam n-ary tree dengan beberapa fungsi spesifik. Anda dapat merancang struktur data Anda dengan cara berikut:
Saya akan menyarankan, Anda menulis struktur simpul dalam satu kelas seperti Class Node {nilai String; Daftarkan anak-anak;} dan semua metode lain seperti pencarian, masukkan dan getChildren di kelas NodeUtils lain sehingga Anda juga dapat melewati root pohon untuk melakukan operasi pada pohon tertentu seperti: class NodeUtils {pencarian Node statis publik (Node root, nilai String) {// lakukan BFS dan kembalikan Node}
sumber
sumber
Saya menulis pustaka pohon yang berfungsi baik dengan Java8 dan tidak memiliki dependensi lain. Ini juga memberikan interpretasi longgar dari beberapa ide dari pemrograman fungsional dan memungkinkan Anda memetakan / menyaring / memangkas / mencari seluruh pohon atau sub pohon.
https://github.com/RutledgePaulV/prune
Implementasinya tidak melakukan sesuatu yang istimewa dengan pengindeksan dan saya tidak menyimpang dari rekursi, jadi ada kemungkinan bahwa dengan kinerja pohon besar akan menurun dan Anda dapat menghancurkan stack. Tetapi jika yang Anda butuhkan adalah pohon langsung dengan kedalaman kecil hingga sedang, saya pikir itu bekerja dengan cukup baik. Ini memberikan definisi kesetaraan yang waras (berbasis nilai) dan juga memiliki implementasi toString yang memungkinkan Anda memvisualisasikan pohon!
sumber
Silakan periksa kode di bawah ini, di mana saya telah menggunakan struktur data Tree, tanpa menggunakan kelas Koleksi. Kode mungkin memiliki bug / perbaikan tetapi harap gunakan ini hanya untuk referensi
sumber
Anda dapat menggunakan kelas TreeSet di java.util. *. Ini berfungsi seperti pohon pencarian Biner, jadi sudah diurutkan. Kelas TreeSet mengimplementasikan antarmuka Iterable, Collection dan Set. Anda dapat melintasi pohon dengan iterator seperti set.
Anda dapat memeriksa, Java Doc dan lainnya .
sumber
Custom Tree mengimplementasikan Tree tanpa menggunakan framework Collection. Ini berisi operasi fundamental berbeda yang diperlukan dalam implementasi Tree.
sumber