JavaRush /Java блогу /Random-KY /Карта интерфейси жөнүндө эң популярдуу суроолорго жооптор...

Карта интерфейси жөнүндө эң популярдуу суроолорго жооптор

Группада жарыяланган
Салам! Бүгүн биз Карта жөнүндө эң кеңири таралган суроолорго жооп беребиз, бирок адегенде анын эмне экенин эстеп көрөлү. Карта интерфейси жөнүндө эң популярдуу суроолорго жооптор - 1Карта ачкыч-маани жуптарынын жыйындысын камтыган маалымат структурасы. Анын маалымат структурасы сөздүктү элестетет, ошондуктан ал көп учурда ушундай деп аталат. Ошол эле учурда, Карта интерфейс болуп саналат жана стандарттык 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. Бардык Карта баалуулуктары аркылуу кантип итерациялоо керек

Маанилердин үстүнөн кайталоо - карталар менен аткарган эң кеңири таралган операция. Бардык ачкыч-маани түгөйлөрү 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. Картаны тизмеге кантип айландырса болот

Карта интерфейсинде элементтердин тизмесин кайтаруучу 3 ыкма бар:
  • keySet() - баскычтардын топтомун кайтарат;
  • values() - баалуулуктардын жыйнагын кайтарат;
  • entrySet() - ачкыч-маанилердин топтомун кайтарат.
Эгер класстын конструкторлорун карасаңыз ArrayList, Collection түрүндөгү аргументи бар конструктор бар экенин байкайсыз. Set Коллекциянын тукуму болгондуктан, жогорудагы бардык ыкмалардын натыйжалары класстын конструкторуна берorши мүмкүн 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 негизги ишке ашырылышы бар. Алардын ар бири өзүнүн өзгөчөлүктөрүнө ээ:
  1. Элементтердин тартиби. HashMapжана Hashtableбуюмдар кошулган тартипте сакталат деп кепилдик бербейт. Мындан тышкары, алар элементтердин тартиби убакыттын өтүшү менен өзгөрбөйт деп кепилдик бербейт. Өз кезегинде, TreeMapал элементтерди алар кошулган тартипте же берилген компараторго ылайык сактоого кепилдик берет.

  2. Жарактуу баалуулуктар. HashMapачкыч жана нөл мааниге ээ болууга мүмкүндүк берет, HashTableжок. TreeMap нөл маанилерди колдоно алат, эгерде салыштыруучу уруксат берсе. Салыштыргычты колдонбостон (жуптарды алар кошулган тартипте сактоо менен) нөлгө жол берилбейт.

  3. Синхронизация. Бир гана HashTableсинхрондоштуруу, калгандары жок. Картага ар кандай жиптер кире албаса, HashTable ордуна HashMap колдонуу сунушталат.

Жана ишке ашыруунун жалпы салыштыруу:
HashMap HashTable TreeMap
Элементтердин тартиби Жок Жок Ооба
маани катары нөл Ооба Жок андай эмес
Жиптин коопсуздугу Жок Ооба Жок
Элементтерди издөөнүн алгоритмдик татаалдыгы O(1) O(1) O(log n)
Капоттун астындагы маалымат структурасы хэш tableсы хэш tableсы кызыл-кара дарак

5. Эки багыттуу карта кантип түзүлөт

Кээде ачкычтар да, баалуулуктар да уникалдуу боло турган маалымат структурасын колдонуу зарыл болуп калат, башкача айтканда, карта ачкыч-ачкыч жуптарын камтыйт. Бул маалымат структурасы картада “инверттелген көрүнүш/издөө” түзүүгө мүмкүндүк берет. Башкача айтканда, биз ачкычты анын мааниси боюнча таба алабыз.Бул маалымат структурасы эки багыттуу карта деп аталат, тилекке каршы, JDK тарабынан колдоого алынbyte. Бирок, бактыга жараша, анын ишке ашырылышын Apache Common Collections же Guava китепканаларынан тапса болот. Ал жерде BidiMap жана BiMap деп аталат. Бул ишке ашыруулар ачкычтардын жана баалуулуктардын уникалдуулугуна чектөөлөрдү киргизет. Бул бирден-бир мамилени жаратат.

6. Кантип бош Картаны түзүү керек

Бош картаны түзүүнүн эки жолу бар:
  1. Кадимки an objectти инициализациялоо:

    Map<Integer, String> emptyMap = new HashMap<>();
  2. Өзгөрбөс бош карта түзүү:

    Map<Integer, String> emptyMap =  Collections.emptyMap();
Мындай картага маалыматтарды кошууга аракет кылганда, биз төмөнкүлөрдү алабыз: UnsupportedOperationExceptionөзгөчө. Бул макалада биз Карта интерфейсин колдонууда сизде пайда болгон эң кеңири тараган суроолорду карап чыктык.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION