Di Jawa, Apakah ada objek yang bertindak seperti Peta untuk menyimpan dan mengakses pasangan kunci / nilai, tetapi dapat mengembalikan daftar kunci yang diurutkan dan daftar nilai yang diurutkan, sedemikian rupa sehingga daftar kunci dan nilai berada dalam urutan yang sama?
Jadi sebagai penjelasan-oleh-kode, saya mencari sesuatu yang berperilaku seperti OrderedMap fiktif saya:
OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");
String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();
for(int i = 0; i < keys.size(); i++)
{
Integer key = keys.get(i);
String value = values.get(i);
Assert(om.get(key) == value);
}
java
collections
Whatsit
sumber
sumber
LinkedHashMap
.Jawaban:
The SortedMap antarmuka (dengan pelaksanaan TreeMap ) harus menjadi teman Anda.
Antarmuka memiliki metode:
keySet()
yang mengembalikan satu set kunci dalam urutan menaikvalues()
yang mengembalikan koleksi semua nilai dalam urutan menaik dari kunci yang sesuaiJadi antarmuka ini memenuhi kebutuhan Anda. Namun, kunci harus memiliki urutan yang berarti. Kalau tidak, Anda dapat menggunakan LinkedHashMap di mana pesanan ditentukan oleh urutan penyisipan.
sumber
LinkedHashMap
yang urutan pengulangannya adalah urutan entri yang terakhir diaksesLinkedHashMap
, urutan iterasi adalah urutan penyisipan, tetapi Anda dapat menggunakan konstruktor yang berbeda untuk menentukan urutan akses sebagai gantinya. docs.oracle.com/javase/8/docs/api/java/util/…Anda sedang mencari java.util.LinkedHashMap . Anda akan mendapatkan daftar Peta. Masukkan pasangan <K, V> , yang selalu diulang dalam urutan yang sama. Urutan itu sama dengan urutan Anda memasukkan item. Atau, gunakan java.util.SortedMap , di mana kunci harus memiliki urutan alami atau memilikinya yang ditentukan oleh a
Comparator
.sumber
keySet()
metode ini secara efektif mengembalikan LinkedHashSet yang mencerminkan urutanput()
panggilan Anda . Perhatikan bahwa panggilan berulangput()
untuk kunci yang sama tidak akan mengubah urutan kecuali Andaremove()
kunci sebelumnya.LinkedHashMap
yang urutan pengulangannya adalah urutan entri yang terakhir diaksesLinkedHashMap mempertahankan urutan kunci.
java.util.LinkedHashMap tampaknya berfungsi sama seperti HashMap normal.
sumber
Saya pikir koleksi terdekat yang akan Anda dapatkan dari kerangka kerja adalah SortedMap
sumber
Anda dapat memanfaatkan antarmuka NavigableMap yang dapat diakses dan dilalui dalam urutan kunci naik atau turun. Antarmuka ini dimaksudkan untuk menggantikan antarmuka SortedMap. Peta Navigable biasanya disortir berdasarkan urutan kuncinya, atau oleh Pembanding yang disediakan pada waktu pembuatan peta.
Ada tiga implementasi yang paling berguna: TreeMap , ImmutableSortedMap , dan ConcurrentSkipListMap .
Contoh TreeMap:
Keluaran:
sumber
Saya pikir antarmuka SortedMap memberlakukan apa yang Anda minta dan TreeMap mengimplementasikannya.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/SortedMap.html http://java.sun.com/j2se/1.5.0/docs/api/java/util /TreeMap.html
sumber
Sejak Java 6 ada juga alternatif thread-safe non-blocking untuk TreeMap . Lihat ConcurrentSkipListMap .
sumber
tl; dr
Untuk menjaga
Map< Integer , String >
agar urutan diurutkan berdasarkan kunci, gunakan salah satu dari dua kelas yang mengimplementasikanSortedMap
/NavigableMap
interface:TreeMap
ConcurrentSkipListMap
Jika memanipulasi peta dalam utas tunggal, gunakan yang pertama
TreeMap
,. Jika memanipulasi seluruh utas, gunakan yang keduaConcurrentSkipListMap
,.Untuk detailnya, lihat tabel di bawah dan diskusi berikut.
Detail
Berikut ini adalah tabel grafik yang saya buat menunjukkan fitur dari sepuluh
Map
implementasi yang dibundel dengan Java 11.The
NavigableMap
antarmuka adalah apa yangSortedMap
seharusnya di tempat pertama. TheSortedMap
logis harus dihapus tetapi tidak bisa karena beberapa implementasi peta pihak ke-3 mungkin menggunakan antarmuka.Seperti yang Anda lihat dalam tabel ini, hanya dua kelas yang mengimplementasikan
SortedMap
/NavigableMap
interface:TreeMap
ConcurrentSkipListMap
Kedua kunci ini disimpan dalam urutan yang diurutkan, baik berdasarkan urutan aslinya (menggunakan
compareTo
metodeComparable
( https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ Comparable.html ) interface) atau denganComparator
implementasi yang Anda lewati. Perbedaan antara dua kelas ini adalah bahwa yang kedua,ConcurrentSkipListMap
adalah benang-aman , sangat bersamaan .Lihat juga kolom Iteration order pada tabel di bawah ini.
LinkedHashMap
kelas mengembalikan entri yang oleh urutan di mana mereka awalnya dimasukkan .EnumMap
mengembalikan entri dalam urutan dimana kelas enum dari kunci didefinisikan . Misalnya, peta yang karyawannya mencakup hari mana dalam seminggu (Map< DayOfWeek , Person >
) menggunakanDayOfWeek
kelas enum yang dibangun di Jawa. Enum itu didefinisikan dengan Senin pertama dan Minggu lalu. Jadi entri dalam iterator akan muncul dalam urutan itu.Enam implementasi lainnya tidak membuat janji tentang urutan di mana mereka melaporkan entri mereka.
sumber
Saya telah menggunakan peta Simple Hash, daftar tertaut, dan Koleksi untuk mengurutkan Peta berdasarkan nilai.
Outputnya adalah:
sumber