JavaRush /Блоги Java /Random-TG /9 Саволҳои беҳтарин дар бораи Харита дар Java
Treefeed
Сатҳи

9 Саволҳои беҳтарин дар бораи Харита дар Java

Дар гурӯҳ нашр шудааст
Ёдовар мешавем, ки Харита маълумоти сохторӣ мебошад, ки аз маҷмӯи ҷуфтҳои калид-арзиш иборат аст ва ҳар як калид метавонад танҳо як маротиба дар як Харитаи ягона истифода шавад. Ин мавзӯъ 9 саволи асосиро дар бораи истифодаи Map дар Java ва синфҳои амалӣшудаи онро дар бар мегирад. Барои соддагӣ, ман дар мисолҳо умумиятҳоро истифода хоҳам кард . Аз ин рӯ, ман танҳо Харитаро бидуни муайян кардани мушаххаскунандаи Харита менависам. Аммо шумо метавонед тахмин кунед, ки ҳарду арзиши K ва V муқоисашавандаанд, яъне K муқоисашавандаро васеъ мекунад ва V низ муқоисашавандаро васеъ мекунад .9 Саволҳои беҳтарин дар бораи Харита дар Java - 1

0. Табдил додани харита ба рӯйхат

Дар Java интерфейси Харита се намуди коллексияҳоро пешниҳод мекунад: маҷмӯи калидҳо, маҷмӯи арзишҳо ва маҷмӯи арзишҳои калидӣ. Ҳамаи онҳоро метавон бо истифода аз созанда ё метод ба РӯйхатaddAll() табдил дод . Парчами codeи зерин нишон медиҳад, ки чӣ тавр аз харита ArrayList сохтан мумкин аст.
// list of keys
List keyList = new ArrayList(Map.keySet());
//list of values
List valueList = new ArrayList(Map.valueSet());
//list key-value
List entryList = new ArrayList(Map.entrySet());

1. Ҳама арзишҳоро дар Харита гузаред

Гузариш тавассути ҳар як ҷуфти калид-арзиш тартиби асосӣ ва асосӣ барои гузаштан аз харита мебошад. Дар Java, ҳар як ҷуфт дар майдони Map бо номи Map.Entry нигоҳ дошта мешавад . Map.entrySet()маҷмӯи арзишҳои калидиро бармегардонад, аз ин рӯ роҳи аз ҳама самараноки такрори тамоми арзишҳои Харита ин аст:
for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
Мо инчунин метавонем -ро Iterator, махсусан дар versionҳои хурдтар аз JDK 1.5 истифода барем
Iterator itr = Map.entrySet().iterator();
while(itr.hasNext()) {
  Entry entry = itr.next();
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}

2. Тартиб додани харитаи калидҳо

Ташкor харитаҳо аз рӯи калидҳо тартиби дигари маъмулан истифодашаванда мебошад. Роҳи аввал ин илова кардани Map.Entry ба рӯйхат аст ва бо истифода аз муқоисакунанда, ки аз рӯи арзишҳо ҷудо мекунад.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getKey().compareTo(e2.getKey());
  }
});
Роҳи дигар: SortedMap -ро истифода баред , ки илова бар ин, калидҳои худро низ бо тартиб ҷойгир мекунад. Аммо, ҳама калидҳо бояд муқоисашавандаро дар бар гиранд ё аз ҷониби муқоисакунанда қабул карда шаванд. Яке аз синфҳои амалӣ TreeMapSortedMap мебошад . Конструктори он компараторро кабул мекунад. Рамзи зерин нишон медиҳад, ки чӣ гуна як муқаррариро ба яки фармоишӣ табдил додан мумкин аст. Map
SortedMap sortedMap = new TreeMap(new Comparator() {

  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }

});
sortedMap.putAll(Map);

3. Тартиби Харитаи аз рӯи арзишҳо

Илова кардани Харита ба рӯйхат ва сипас мураттабсозии он дар ин ҳолат кор мекунад, аммо ин дафъа шумо бояд -ро истифода баред Entry.getValue(). Рамзи дар поён буда тақрибан ҳамон тавре ки қаблан аст.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getValue().compareTo(e2.getValue());
  }

});
Мо ҳоло ҳам метавонем онро SortedMapдар ин ҳолат истифода барем, аммо танҳо агар арзишҳо беназир бошанд. Дар ин ҳолат, шумо метавонед ҷуфти калид-арзишро ба арзиши калид табдил диҳед. Ин ҳалли маҳдудиятҳои ҷиддӣ дорад ва аз ҷониби ман тавсия дода намешавад.

4. Оғоз кардани Харитаи статикӣ/тағирнопазир

Вақте ки шумо хоҳед, ки Харита бетағйир боқӣ монад, роҳи хубе ин аст, ки онро ба харитаи тағирнашаванда нусхабардорӣ кунед. Ин техникаи барномасозии муҳофизатӣ ба шумо кӯмак мекунад, ки харитаеро эҷод кунед, ки на танҳо барои истифода бехатар, балки барои ришта низ бехатар аст. Барои ба кор андохтани харитаи статикӣ/тағирнопазир, мо метавонем инициализаторро истифода барем static(ба поён нигаред). Мушкилот бо ин code дар он аст, ки сарфи назар аз эълон кардани Харита ҳамчун static final, мо метавонем бо он пас аз оғозёбӣ кор кунем, масалан Test.Map.put(3,"three");. Пас, он тағирнопазирии воқеӣ нест. Барои сохтани Харитаи тағирнаёбанда бо истифода аз ибтидои статикӣ, ба мо синфи бениҳоят беном лозим аст, ки мо онро дар марҳилаи охирини оғозёбӣ ба Харитаи тағирнашаванда илова мекунем. Лутфан ба қисми дуюми code нигаред. Вақте ки агар шумо иҷро кунед, UnsupportedOperationExceptionTest.Map.put(3,"three"); партофта мешавад .
public class Test {

  private static final Map Map;
  static {
    Map = new HashMap();
    Map.put(1, "one");
    Map.put(2, "two");
  }
}
public class Test {

  private static final Map Map;
  static {
    Map aMap = new HashMap();
    aMap.put(1, "one");
    aMap.put(2, "two");
    Map = Collections.unmodifiableMap(aMap);
  }
}
Китобхонаи Guava инчунин роҳҳои гуногуни оғоз кардани коллексияҳои статикӣ ва тағирнашавандаро дастгирӣ мекунад. Барои гирифтани маълумоти бештар дар бораи манфиатҳои утorтаи коллексияҳои ивазнашавандаи Гуава, ба бахши Коллексияҳои тағирнашаванда дар тарзи Guava нигаред .

5. Фарқи байни HashMap, TreeMap ва Hashtable

Дар Java се татбиқи асосии интерфейси Map мавҷуданд : HashMap , TreeMap ва Hashtable . Фарқиятҳои асосии инҳоянд:
  • Тартиби гузариш . HashMap ва HashTable фармоиши Харитаро кафолат намедиҳад; аз чумла, кафолат намедиханд, ки тартибот бо мурури замон бетаъхир мемонад. Аммо TreeMapон ҳама арзишҳоро бо "тартиби табиии" калидҳо ё муқоисакунанда фармоиш медиҳад.
  • Ҷуфтҳои дурусти калид-арзиш. HashMapба шумо имкон медиҳад, ки калиди нул ва арзиши нул дошта бошед. HashTableкалиди нул ё арзиши нулро иҷозат намедиҳад. Агар TreeMapтартиби табиӣ истифода шавад ё муқоисакунанда калиди нулро иҷозат надиҳад, истисно партофта мешавад.
  • Синхронизатсия . Танҳо HashTableҳамоҳангшуда, боқимонда нестанд. Аммо, "агар татбиқи риштаи бехатар лозим набошад, тавсия дода мешавад, ки " HashMapба ҷои HashTable.
Муқоисаи муфассал
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

Упорядочивание          |нет      |нет        | да
null в ключ-meaning    | да-да   | нет-нет   | нет-да
синхронизировано        | нет     | да        | нет
производительность      | O(1)    | O(1)      | O(log n)
воплощение              | корзины | корзины   | красно-чёрное дерево
Муфассалтар дар бораи муносибати HashMap против . TreeMap против. Hashtable vs. LinkedHashMap .

6. Харита бо ҷустуҷӯ/намоиши баръакс

Баъзан, ба мо маҷмӯи ҷуфтҳои калидҳо лозим аст, ки ин маънои онро дорад, ки арзишҳо мисли калидҳо беназиранд (намуди як ба як). Ин мувофиқат ба шумо имкон медиҳад, ки дар харита "намоиш/ҷустуҷӯи баръакс" эҷод кунед. Яъне, мо метавонем калидро аз рӯи арзишаш пайдо кунем. Ин сохтори додаҳо Харитаи дуҷониба номида мешавад , ки мутаассифона, онро JDK дастгирӣ намекунад. Ҳарду Коллексияҳои Common Apache ва Guava татбиқи харитаи дуҷонибаро бо номи BidiMap ва BiMap пешниҳод мекунанд. Ҳарду маҳдудиятеро ҷорӣ мекунанд, ки харитасозии 1:1 байни калидҳо ва арзишҳоро маҷбур мекунад.

7. Нусхаи сусти Харита

Қариб ҳама, агар на ҳама, Харитаҳо дар Java дорои конструктори нусхабардории Харитаи дигар мебошанд. Аммо тартиби нусхабардорӣ ҳамоҳанг карда нашудааст. Ин маънои онро дорад, ки вақте як ришта Харитаро нусхабардорӣ мекунад, риштаи дигар метавонад сохтори онро тағир диҳад. Барои пешгирии синхронизатсияи ногаҳонии нусхабардорӣ, яке аз онҳо бояд дар чунин ҳолат истифода шавад Collections.synchronizedMap().
Map copiedMap = Collections.synchronizedMap(Map);
Роҳи дигари ҷолиби нусхабардорӣ ба таври ноустувор ин истифодаи clone(). Аммо он ҳатто аз ҷониби созандаи чаҳорчӯбаи коллексияи Java Ҷошуа Блох тавсия дода намешавад. Дар мубоҳисаи " Сохтмони нусхабардорӣ ва клонкунӣ " ӯ чунин мавқеъро ишғол мекунад: Иқтибос: "Ман аксар вақт усули клони оммавиро дар синфҳои мушаххас дохил мекунам, зеро одамон интизори он ҳастанд, ки онҳо дар он ҷо хоҳанд буд. ... шармовар аст, ки Клонкунӣ вайрон шудааст, аммо ин рӯй дод... Клонкунӣ як нуқтаи заиф аст ва ман фикр мекунам, ки одамонро аз маҳдудиятҳои он огоҳ кардан лозим аст." Аз ин сабаб, ман ҳатто ба шумо нишон намедиҳам, ки чӣ тавр истифода бурдани усули clone()нусхабардории Map

8. Харитаи холӣ созед

Агар Mapтағирнопазир бошад, истифода баред:
Map = Collections.emptyMap();
Ё, ягон таҷассуми дигарро истифода баред. Барои намуна:
Map = new HashMap();
ПОЁН
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION