JavaRush /Java блогы /Random-KK /Карта интерфейсі туралы ең танымал сұрақтарға жауаптар

Карта интерфейсі туралы ең танымал сұрақтарға жауаптар

Топта жарияланған
Сәлеметсіз бе! Бүгін біз Карта туралы жиі кездесетін сұрақтарға жауап береміз, бірақ алдымен оның не екенін еске түсірейік. Карта интерфейсі туралы ең танымал сұрақтарға жауаптар - 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. Барлық Карта мәндері арқылы қайталау әдісі

Мәндерді қайталау - карталармен орындайтын ең көп таралған операция. Барлық кілт-мән жұптары 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. Карта пернелері қалай сұрыпталады

Карталарды сұрыптау да бағдарламалауда кең таралған операция болып табылады. Мұны бірнеше жолмен жасауға болады:
  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оның конструкторында 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 негізгі іске асырылуы бар. Олардың әрқайсысының өзіндік ерекшеліктері бар:
  1. Элементтердің реті. HashMapжәне Hashtableэлементтер қосылған ретпен сақталатынына кепілдік бермеңіз. Сонымен қатар, олар элементтердің реті уақыт өте келе өзгермейтініне кепілдік бермейді. Ол өз кезегінде TreeMapэлементтерді қосу ретімен немесе берілген компараторға сәйкес сақтауға кепілдік береді.

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

  3. Синхрондау. Тек HashTableсинхрондалған, қалғандары жоқ. Егер картаға әртүрлі ағындар қол жеткізе алмайтын болса, HashTable орнына HashMap пайдалану ұсынылады.

Және іске асыруды жалпы салыстыру:
HashMap Хэш кестесі TreeMap
Элементтердің реті Жоқ Жоқ Иә
мән ретінде нөл Иә Жоқ Жоға
Жіп қауіпсіздігі Жоқ Иә Жоқ
Элементтерді іздеудің алгоритмдік күрделілігі O(1) O(1) O(log n)
Сорғыштың астындағы деректер құрылымы хэш кестесі хэш кестесі қызыл-қара ағаш

5. Екі бағытты карта қалай жасалады

Кейде кілттер де, мәндер де бірегей болатын деректер құрылымын пайдалану қажет болады, яғни картада кілт-кілт жұптары болады. Бұл деректер құрылымы картада «инверттелген көрініс/іздеу» жасауға мүмкіндік береді. Яғни, біз кілтті оның мәні бойынша таба аламыз.Бұл деректер құрылымы екі бағытты карта деп аталады, өкінішке орай, JDK қолдамайды. Бірақ, бақытымызға орай, оның орындалуын Apache Common Collections немесе Guava кітапханаларында табуға болады. Онда ол BidiMap және BiMap деп аталады. Бұл енгізулер кілттер мен мәндердің бірегейлігіне шектеулер қояды. Бұл бір-бір қарым-қатынасты тудырады.

6. Бос Картаны қалай жасауға болады

Бос картаны жасаудың екі жолы бар:
  1. Қалыпты нысанды инициализациялау:

    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