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. Карта баскычтарын кантип сорттоо керек
Карталарды сорттоо да программалоодо кеңири таралган операция болуп саналат. Муну бир нече жол менен кыла аласыз:-
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));
-
Колдонуңуз
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 негизги ишке ашырылышы бар. Алардын ар бири өзүнүн өзгөчөлүктөрүнө ээ:-
Элементтердин тартиби.
HashMap
жанаHashtable
буюмдар кошулган тартипте сакталат деп кепилдик бербейт. Мындан тышкары, алар элементтердин тартиби убакыттын өтүшү менен өзгөрбөйт деп кепилдик бербейт. Өз кезегинде,TreeMap
ал элементтерди алар кошулган тартипте же берилген компараторго ылайык сактоого кепилдик берет. -
Жарактуу баалуулуктар.
HashMap
ачкыч жана нөл мааниге ээ болууга мүмкүндүк берет,HashTable
жок. TreeMap нөл маанилерди колдоно алат, эгерде салыштыруучу уруксат берсе. Салыштыргычты колдонбостон (жуптарды алар кошулган тартипте сактоо менен) нөлгө жол берилбейт. -
Синхронизация. Бир гана
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. Кантип бош Картаны түзүү керек
Бош картаны түзүүнүн эки жолу бар:-
Кадимки an objectти инициализациялоо:
Map<Integer, String> emptyMap = new HashMap<>();
-
Өзгөрбөс бош карта түзүү:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
өзгөчө. Бул макалада биз Карта интерфейсин колдонууда сизде пайда болгон эң кеңири тараган суроолорду карап чыктык.
Дагы эмнени окуу керек: |
---|
GO TO FULL VERSION