Peta adalah kumpulan pasangan nilai kunci, juga dikenal sebagai kamus atau array asosiatif, dll., Dan merupakan salah satu struktur data yang paling umum. Bagaimana cara menyortir peta berdasarkan nilai di java? Tampaknya sederhana, tapi tidak mudah!
Misalnya, di peta, kunci adalah tipe string, yang mewakili kata, dan nilainya adalah tipe int, yang mewakili berapa kali kata muncul. Sekarang kami ingin menyortir berapa kali kata itu muncul:
Peta peta = treemap baru (); peta.put ("me", 1000); peta.put ("dan", 4000); peta.put ("you", 3000); peta.put ("makanan", 10000); peta.put ("lapar", 5000); peta.put ("nanti", 6000); Hasil penyortiran berdasarkan nilai harus:
ValueM Kunci 1000 Anda 3000 dan 4000Hungry 5000later 6000food 10000
Pertama -tama, kita tidak dapat mengadopsi struktur sortedmap, karena sortedmap adalah peta yang diurutkan berdasarkan tombol, bukan peta yang diurutkan berdasarkan nilai. Yang kami inginkan adalah peta yang diurutkan berdasarkan nilai.
Tidak bisakah Anda melakukan ini dengan sortedmap?
Tidak, karena peta sedang diurutkan berdasarkan kuncinya.
Metode 1:
Kode Java berikut:
impor java.util.iterator; impor java.util.set; impor java.util.treeset; kelas publik utama {public static void main (string [] args) {set set = new treeset (); set.add (pasangan baru ("saya", "1000")); set.add (pasangan baru ("dan", "4000")); set.add (pasangan baru ("Anda", "3000")); set.add (pasangan baru ("makanan", "10000")); set.add (pasangan baru ("lapar", "5000")); set.add (pasangan baru ("nanti", "6000")); set.add (pasangan baru ("diri saya", "1000")); untuk (iterator i = set.iterator (); i.hasnext ();) system.out.println (i.next ()); }} kelas pasangan mengimplementasikan nama string final yang sebanding; nomor int final pribadi; pair public (nama string, nomor int) {this.name = name; this.number = angka; } pair pair (nama string, nomor string) melempar NumberFormateException {this.name = name; this.number = integer.parseint (angka); } public int compareto (objek o) {if (o instance dari pasangan) {int cmp = double.compare (angka, ((pair) o) .number); if (cmp! = 0) {return cmp; } return name.compareto (((pair) o) .name); } lempar classcastException baru ("tidak dapat membandingkan pasangan dengan" + o.getClass (). getName ()); } public string toString () {return name + '' + number; }} Kode C ++ yang serupa:
typedef pair <string, int> pair; int cmp (const pair & x, const pair & y) {return x.second> y.second;} peta <string, int> m; vector <paser> vec; for (peta <wstring, int> :: iterator arusr = m.begin (); arus; Curr-> kedua));} sort (vec.begin (), vec.end (), cmp); Signifikansi penting dari metode di atas adalah: merangkum pasangan nilai kunci (MAP.Entry) dalam struktur peta ke dalam kelas khusus (struct), atau menggunakan kelas MAP.Entry secara langsung. Kelas khusus tahu cara mengurutkan diri mereka sendiri, yaitu, mengurutkan berdasarkan nilai, secara khusus mengimplementasikan antarmuka yang sebanding atau membangun objek pembanding untuk diri mereka sendiri, dan kemudian menggunakan set yang dipesan tanpa menggunakan struktur peta (SortedSet, TreeSet adalah implementasi SortedSet), yang merealisasikan tujuan berdasarkan nilai dalam peta. Dengan kata lain, alih -alih menggunakan peta, peta.Entry dianggap sebagai objek, sehingga masalahnya menjadi untuk mengimplementasikan set objek yang dipesan atau menyortir set objek. Anda dapat menggunakan sortedset, sehingga setelah penyisipan selesai, secara alami akan dipesan, atau menggunakan daftar atau array, dan kemudian mengurutkannya (collections.sort () atau arrays.sort ()).
Merangkum informasi di kelasnya sendiri. Baik mengimplementasikan
Aturan yang sebanding dan tulis untuk pemesanan alami atau tulis a
Pembanding berdasarkan kriteria Anda. Simpan informasi dalam yang diurutkan
pengumpulan, atau gunakan metode collections.sort ().
Metode 2:
Anda juga dapat menggunakan kode berikut untuk mengurutkan berdasarkan nilai:
Public Static Map sortByValue (peta peta) {daftar daftar = new LinkedList (MAP.ENTRYSET ()); Collections.sort (daftar, pembanding baru () {public int perbandingan (objek o1, objek o2) {return ((sebanding) ((map.entry) (o1)). GetValue ()) .compareto ((peta.entry) (o2)). GetValue ());}}); Hasil peta = LinkedHashMap () baru; untuk (iterator it = list.iterator (); it.hasnext ();) {map.entry entri = (map.entry) it.next (); result.put (entry.getKey (), entry.getValue ()); } hasil pengembalian; } peta public peta sortByValue (peta peta, boolean final reverse) {list list = new LinkedList (map.entryset ()); Collections.sort (daftar, pembanding baru () {public int perbandingan (objek o1, objek o2) {if (reverse) {return -((sebanding) ((map.entry) (o1))). GetValue ()) .compareto ((map.entry) (o2)). GetValue ()) .compareto ((MAP.ENTRY) (o2)). .compareto (((map.entry) (o2)). getValue ()); Hasil peta = LinkedHashMap () baru; untuk (iterator it = list.iterator (); it.hasnext ();) {map.entry entri = (map.entry) it.next (); result.put (entry.getKey (), entry.getValue ()); } hasil pengembalian; } Peta peta = hashmap baru (); peta.put ("A", 4); peta.put ("b", 1); peta.put ("c", 3); Map.put ("D", 2); Peta diurutkan = sortByValue (peta); System.out.println (diurutkan); // output: {b = 1, d = 2, c = 3, a = 4} atau dapat dilakukan seperti ini: peta peta = hashMap baru (); peta.put ("A", 4); peta.put ("b", 1); peta.put ("c", 3); Map.put ("D", 2); Atur <map.entry <string, integer >> treeset = new Treeset <map.entry <string, integer >> (pembanding baru <map.entry <string, integer >> () {public int compare (map.entry <string, integer> o1, map.entry <string, integer, o2) {string, o1, peta. o2.getValue (); Treeeset.addall (map.entryset ()); System.out.println (Treeset); // output: [a = 4, c = 3, d = 2, b = 1] Selain itu, mengimplementasikan sortir peta berdasarkan nilai di Groovy tentu saja esensinya sama, tetapi sangat sederhana:
Gunakan metode sortir peta dalam groovy (membutuhkan groovy 1.6).
Def result = map.sort () {a, b -> b.value.compareto (a.value)} menyukai:
["A": 3, "B": 1, "C": 4, "D": 2] .sort {a, b -> a.value - b.value}
Hasilnya adalah: [B: 1, D: 2, A: 3, C: 4]
Mirip dengan Python:
h = {"a":2,"b":1,"c":3}i = h.items() // i = [('a', 2), ('c', 3), ('b', 1)]i.sort(lambda (k1,v1),(k2,v2): cmp(v2,v1) ) // i = [('c', 3), ('a', 2), ('b', 1)]Artikel di atas secara singkat berbicara tentang Java Map Sorts berdasarkan nilai adalah semua konten yang saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.