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 коллекцияның ұрпағы болғандықтан, жоғарыда аталған барлық әдістердің нәтижелерін класс конструкторына беруге болады 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
оның конструкторында Comparator қабылдайтын оның орындалуын пайдаланыңыз . Бұл компаратор карта пернелеріне қолданылады, сондықтан кілттер интерфейсті жүзеге асыратын сыныптар болуы керек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 нөлдік мәндерді тек компаратор рұқсат еткен жағдайда ғана пайдалана алады. Салыстырғышты пайдаланбай (жұптарды олар қосылған ретпен сақтау арқылы) null рұқсат етілмейді. -
Синхрондау. Тек
HashTable
синхрондалған, қалғандары жоқ. Егер картаға әртүрлі ағындар қол жеткізе алмайтын болса, HashTable орнына HashMap пайдалану ұсынылады.
HashMap | Хэш кестесі | TreeMap | |
---|---|---|---|
Элементтердің реті | Жоқ | Жоқ | Иә |
мән ретінде нөл | Иә | Жоқ | Жоға |
Жіп қауіпсіздігі | Жоқ | Иә | Жоқ |
Элементтерді іздеудің алгоритмдік күрделілігі | O(1) | O(1) | O(log n) |
Сорғыштың астындағы деректер құрылымы | хэш кестесі | хэш кестесі | қызыл-қара ағаш |
5. Екі бағытты карта қалай жасалады
Кейде кілттер де, мәндер де бірегей болатын деректер құрылымын пайдалану қажет болады, яғни картада кілт-кілт жұптары болады. Бұл деректер құрылымы картада «инверттелген көрініс/іздеу» жасауға мүмкіндік береді. Яғни, біз кілтті оның мәні бойынша таба аламыз.Бұл деректер құрылымы екі бағытты карта деп аталады, өкінішке орай, JDK қолдамайды. Бірақ, бақытымызға орай, оның орындалуын Apache Common Collections немесе Guava кітапханаларында табуға болады. Онда ол BidiMap және BiMap деп аталады. Бұл енгізулер кілттер мен мәндердің бірегейлігіне шектеулер қояды. Бұл бір-бір қарым-қатынасты тудырады.6. Бос Картаны қалай жасауға болады
Бос картаны жасаудың екі жолы бар:-
Қалыпты нысанды инициализациялау:
Map<Integer, String> emptyMap = new HashMap<>();
-
Өзгермейтін бос карта жасау:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
ерекше жағдай. Бұл мақалада біз Карта интерфейсін пайдалану кезінде туындауы мүмкін жиі кездесетін сұрақтарды қарастырдық.
Тағы не оқу керек: |
---|
GO TO FULL VERSION