JavaRush /Блоги Java /Random-TG /Ҷавобҳо ба саволҳои маъмултарин дар бораи интерфейси Map

Ҷавобҳо ба саволҳои маъмултарин дар бораи интерфейси Map

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо ба саволҳои маъмултарин дар бораи Map ҷавоб медиҳем, аммо аввал биёед дар хотир дорем, ки ин чист. Ҷавобҳо ба саволҳои маъмултарин дар бораи интерфейси Map - 1Харита сохтори додаест, ки маҷмӯи ҷуфтҳои калид-арзишро дар бар мегирад. Сохтори маълумоти он ба луғат шабоҳат дорад, бинобар ин онро аксар вақт чунин меноманд. Дар айни замон, Map интерфейс аст ва дар jdk стандартӣ он татбиқи асосиро дар бар мегирад: Hashmap, LinkedHashMap, Hashtable, TreeMap. Татбиқи аз ҳама бештар истифодашаванда Hashmap аст, аз ин рӯ мо онро дар мисолҳои худ истифода хоҳем кард. Эҷод ва пур кардани харитаи стандартӣ чунин аст:
Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
Ва ин аст, ки чӣ тавр арзишҳоро бо калид ба даст овардан мумкин аст:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
Агар ҳамаи гуфтаҳои боло равшан бошад, биёед ба ҷавобҳои худ ба саволҳои маъмул идома диҳем!

0. Чӣ тавр ба воситаи ҳамаи арзишҳои Харита такрор

Итератсия бар арзишҳо маъмултарин амалиётест, ки шумо бо харитаҳо иҷро мекунед. Ҳама ҷуфтҳои калид-арзиш дар интерфейси дохorи Map.Entry нигоҳ дошта мешаванд ва барои гирифтани онҳо шумо бояд ба entrySet(). Он Маҷмӯи ҷуфтҳоро бармегардонад, ки тавассути онҳо ҳал кардан мумкин аст:
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. Чӣ тавр табдил Харитаи ба рӯйхат

Интерфейси Map дорои 3 усулест, ки рӯйхати элементҳоро бармегардонад:
  • keySet() - маҷмӯи калидҳоро бар мегардонад;
  • values() - Маҷмӯаи арзишҳоро бар мегардонад;
  • entrySet () - маҷмӯи маҷмӯи арзишҳои калидиро бармегардонад.
Агар шумо ба конструкторҳои синфи назар андозед ArrayList, мебинед, ки конструктор бо аргументи навъи Collection мавҷуд аст. Азбаски Set насли Коллексия аст, натиҷаҳои ҳамаи усулҳои дар боло зикршударо метавон ба конструктори синф интиқол дод ArrayList. Ҳамин тавр, мо рӯйхатҳои нав эҷод мекунем ва онҳоро бо арзишҳои зерин пур мекунем 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. Чӣ тавр калидҳои харитаҳоро ҷудо кардан мумкин аст

Ҷудокунии харитаҳо инчунин як амалиёти хеле маъмул дар барномасозӣ мебошад. Шумо метавонед инро бо чанд роҳ иҷро кунед:
  1. Map.Entry -ро ба рӯйхат гузоред ва онро бо истифода аз Comparator ҷудо кунед .

    Дар муқоисакунанда мо танҳо калидҳои ҷуфтҳоро муқоиса мекунем:

    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();
       }
    });
    

    Агар шумо ламбдаҳоро фаҳмед, ин сабтро ба таври назаррас кӯтоҳ кардан мумкин аст:

    Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
  2. -ро истифода баред SortedMap, ё дақиқтараш, татбиқи он TreeMap, ки дар созандаи худ Муқоисакунандаро мегирад. Ин муқоисакунанда ба калидҳои харита татбиқ карда мешавад, бинобар ин калидҳо бояд синфҳое бошанд, ки интерфейсро амалӣ мекунанд Comparable:

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

    Ва, албатта, ҳама чизро метавон бо истифода аз ламбдаҳо дубора навишт:

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

    Баръакси усули аввал, бо истифода аз SortedMap, мо ҳамеша маълумотро дар шакли ҷудошуда нигоҳ медорем.

3. Чӣ тавр ба ҷудо кардани арзишҳои харита

Дар ин ҷо шумо бояд равиши монандро ба усули аввал барои калидҳо истифода баред - рӯйхати арзишҳоро гиред ва онҳоро дар рӯйхат ҷудо кунед:
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());
   }
});
Ва ламбда барои ин чунин менамояд:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));

4. Фарқи байни HashMap, TreeMap ва Hashtable чист?

Тавре ки қаблан зикр гардид, 3 амалисозии асосии интерфейси Map вуҷуд дорад. Ҳар яке аз онҳо хусусиятҳои худро дорад:
  1. Тартиби элементҳо. HashMapва Hashtableкафолат намедиҳед, ки ашё бо тартиби иловашуда нигоҳ дошта мешаванд. Илова бар ин, онҳо кафолат намедиҳанд, ки тартиби элементҳо бо мурури замон тағир намеёбад. Дар навбати худ, TreeMapон нигоҳдории элементҳоро бо тартиби иловашуда ё мувофиқи муқоисаи додашуда кафолат медиҳад.

  2. Арзишҳои эътибор. HashMapба шумо имкон медиҳад, ки калид ва арзиши сифр дошта бошед, HashTableнест. TreeMap метавонад танҳо арзишҳои нулро истифода барад, агар муқоисакунанда иҷозат диҳад. Бе истифодаи муқоисакунанда (бо нигоҳ доштани ҷуфтҳо бо тартиби иловашуда), null иҷозат дода намешавад.

  3. Синхронизатсия. Танҳо HashTableҳамоҳангшуда, боқимонда нестанд. Агар ба харита риштаҳои гуногун дастрас нашаванд, тавсия дода мешавад, ки ба ҷои HashTable HashMap -ро истифода баред.

Ва муқоисаи умумии татбиқ:
HashMap Ҷадвали Hash TreeMap
Тартиби элементҳо Не Не Бале
нул ҳамчун арзиш Бале Не На дарвоқеъ
Бехатарии ришта Не Бале Не
Мушкorи алгоритмии ҷустуҷӯи элементҳо О(1) О(1) O(log n)
Сохтори маълумот дар зери сарпӯш ҷадвали ҳаш ҷадвали ҳаш дарахти сурх-сиёх

5. Тарзи сохтани харитаи дутарафа

Баъзан истифодаи сохтори додаҳо лозим мешавад, ки дар он ҳам калидҳо ва ҳам арзишҳо беназир хоҳанд буд, яъне харита дорои ҷуфтҳои калидҳо мебошад. Ин сохтори додаҳо ба шумо имкон медиҳад, ки дар харита "намоиш/ҷустуҷӯи баръакс" эҷод кунед. Яъне, мо метавонем калидро аз рӯи арзиши он пайдо кунем.Ин сохтори додаҳо харитаи дуҷониба номида мешавад, ки мутаассифона, аз ҷониби JDK дастгирӣ намешавад. Аммо, хушбахтона, татбиқи онро дар коллексияҳои умумии Apache ё китобхонаҳои Гуава пайдо кардан мумкин аст. Дар он ҷо онро мутаносибан BidiMap ва BiMap меноманд. Ин татбиқҳо ба ягонагии калидҳо ва арзишҳо маҳдудиятҳо ҷорӣ мекунанд. Ин муносибати як ба якро ба вуҷуд меорад.

6. Чӣ тавр сохтани Харитаи холӣ

Ду роҳи сохтани харитаи холӣ вуҷуд дорад:
  1. Оғозсозии an objectи муқаррарӣ:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. Эҷоди харитаи холии тағирнашаванда:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
Вақте ки мо кӯшиш мекунем, ки маълумотро ба чунин харита илова кунем, мо мегирем: UnsupportedOperationExceptionистисно. Дар ин мақола, мо ба саволҳои маъмултарине, ки шумо ҳангоми истифодаи интерфейси Map дошта метавонед, дида баромадем.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION