JavaRush /Blog Java /Random-MS /Jawapan kepada soalan paling popular tentang antara muka ...

Jawapan kepada soalan paling popular tentang antara muka Peta

Diterbitkan dalam kumpulan
hello! Hari ini kita akan memberikan jawapan kepada soalan yang paling biasa tentang Peta, tetapi pertama sekali, mari kita ingat apa itu. Jawapan kepada soalan paling popular tentang antara muka Peta - 1Peta ialah struktur data yang mengandungi set pasangan nilai kunci. Struktur datanya menyerupai kamus, itulah sebabnya ia sering dipanggil demikian. Pada masa yang sama, Map ialah antara muka , dan dalam jdk standard ia mengandungi pelaksanaan utama: Hashmap, LinkedHashMap, Hashtable, TreeMap. Pelaksanaan yang paling banyak digunakan ialah Hashmap, jadi kami akan menggunakannya dalam contoh kami. Inilah rupa penciptaan dan pengisian standard peta:
Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
Dan ini adalah cara untuk mendapatkan nilai dengan kunci:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
Jika semua perkara di atas jelas, mari teruskan kepada jawapan kami kepada soalan popular!

0. Bagaimana untuk lelaran melalui semua nilai Peta

Mengulang nilai adalah operasi paling biasa yang anda lakukan dengan peta. Semua pasangan nilai kunci disimpan dalam antara muka Map.Entry dalaman, dan untuk mendapatkannya, anda perlu memanggil entrySet(). Ia mengembalikan Set pasangan yang boleh digelung melalui:
for(Map.Entry<Integer, String> entry: map.entrySet()) {
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

Или используя итератор:
Iterator<Map.Entry<Integer, String>> itr = map.entrySet().iterator();
while(itr.hasNext()) {
   Map.Entry<Integer, String> entry =  itr.next();
   // get key
   Integer key = entry.getKey();
   // get value
   String value = entry.getValue();
}

1. Bagaimana untuk menukar Peta kepada Senarai

Antara muka Peta mempunyai 3 kaedah yang mengembalikan senarai elemen:
  • keySet() - mengembalikan Set kunci;
  • values() - mengembalikan Koleksi nilai;
  • entrySet() - mengembalikan Set set nilai kunci.
Jika anda melihat pembina class ArrayList, anda akan melihat bahawa terdapat pembina dengan hujah jenis Collection. Memandangkan Set adalah keturunan Koleksi, hasil semua kaedah di atas boleh dihantar kepada pembina kelas ArrayList. Jadi kami akan membuat senarai baharu dan mengisinya dengan nilai daripada Map:
// key list
List<Integer> keyList = new ArrayList<>(map.keySet());
// value list
List<String> valueList = new ArrayList<>(map.values());
// key-value list
List<Map.Entry<Integer, String>> entryList = new ArrayList<>(map.entrySet());

2. Cara mengisih kekunci peta

Mengisih peta juga merupakan operasi yang agak biasa dalam pengaturcaraan. Anda boleh melakukan ini dalam beberapa cara:
  1. Letakkan Map.Entry ke dalam senarai dan susunkannya menggunakan Comparator .

    Dalam pembanding kita akan membandingkan hanya kunci pasangan:

    List> list = new ArrayList(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
       @Override
       public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
           return o1.getKey() - o2.getKey();
       }
    });
    

    Jika anda memahami lambdas, entri ini boleh dipendekkan dengan ketara:

    Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
  2. Use SortedMap, atau lebih tepat lagi, its implementation TreeMap, yang mengambil Comparator dalam pembinanya. Pembanding ini akan digunakan pada kekunci peta, jadi kunci mestilah kelas yang melaksanakan antara muka Comparable:

    SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() {
       @Override
       public int compare(Integer o1, Integer o2) {
           return o1 - o2;
       }
    });

    Dan, sudah tentu, semuanya boleh ditulis semula menggunakan lambdas:

    SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));

    Tidak seperti kaedah pertama, menggunakan SortedMap, kami akan sentiasa menyimpan data dalam bentuk yang diisih.

3. Cara mengisih nilai peta

Di sini anda harus menggunakan pendekatan yang serupa dengan yang pertama untuk kunci - dapatkan senarai nilai dan susunkannya dalam senarai:
List <Map.Entry<Integer, String>> valuesList = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
   @Override
   public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
       return o1.getValue().compareTo(o2.getValue());
   }
});
Dan lambda untuk ini kelihatan seperti ini:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));

4. Apakah perbezaan antara HashMap, TreeMap dan Hashtable

Seperti yang dinyatakan sebelum ini, terdapat 3 pelaksanaan utama antara muka Peta. Setiap daripada mereka mempunyai ciri-ciri sendiri:
  1. Susunan unsur. HashMapdan Hashtabletidak menjamin bahawa item akan disimpan mengikut susunan ia ditambahkan. Di samping itu, mereka tidak menjamin bahawa susunan elemen tidak akan berubah dari semasa ke semasa. Sebaliknya, TreeMapia menjamin penyimpanan elemen dalam susunan ia ditambah atau mengikut pembanding yang diberikan.

  2. Nilai yang sah. HashMapmembolehkan anda mempunyai kunci dan nilai nol, HashTabletidak. TreeMap hanya boleh menggunakan nilai nol jika pembanding membenarkannya. Tanpa menggunakan pembanding (dengan menyimpan pasangan dalam susunan yang ditambah), null tidak dibenarkan.

  3. Penyegerakan. Hanya HashTabledisegerakkan, selebihnya tidak. Jika peta tidak akan diakses oleh urutan yang berbeza, adalah disyorkan untuk menggunakan HashMap dan bukannya HashTable.

Dan perbandingan umum pelaksanaan:
HashMap HashTable Peta Pokok
Susunan unsur Tidak Tidak ya
null sebagai nilai ya Tidak Tidak juga
Keselamatan benang Tidak ya Tidak
Kerumitan algoritma mencari unsur O(1) O(1) O(log n)
Struktur data di bawah hud jadual hash jadual hash pokok merah-hitam

5. Cara membuat peta dwiarah

Kadang-kadang menjadi perlu untuk menggunakan struktur data di mana kedua-dua kunci dan nilai akan menjadi unik, iaitu, peta akan mengandungi pasangan kunci-kunci. Struktur data ini membolehkan anda membuat "pandangan/carian terbalik" pada peta. Iaitu, kita boleh mencari kunci mengikut nilainya. Struktur data ini dipanggil peta dua arah, yang malangnya, tidak disokong oleh JDK. Tetapi, mujurlah, pelaksanaannya boleh didapati di perpustakaan Apache Common Collections atau Guava. Di sana ia dipanggil BidiMap dan BiMap, masing-masing. Pelaksanaan ini mengenakan sekatan ke atas keunikan kunci dan nilai. Ini mewujudkan hubungan satu dengan satu.

6. Cara membuat Peta kosong

Terdapat dua cara untuk membuat peta kosong:
  1. Permulaan objek biasa:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. Mencipta peta kosong yang tidak boleh diubah:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
Apabila kami cuba menambah data pada peta sedemikian, kami akan menerima: UnsupportedOperationExceptionpengecualian. Dalam artikel ini, kami melihat soalan paling biasa yang mungkin anda ada semasa menggunakan antara muka Peta.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION