JavaRush /Blog Jawa /Random-JV /Top 9 Pitakonan Babagan Peta ing Jawa
Treefeed
tingkat

Top 9 Pitakonan Babagan Peta ing Jawa

Diterbitake ing grup
Elinga yen Peta minangka data terstruktur sing dumadi saka sakumpulan pasangan nilai kunci, lan saben tombol mung bisa digunakake sapisan ing sawijining Peta. Topik iki nyakup 9 pitakonan dhasar babagan nggunakake Peta ing Jawa lan kelas sing ditindakake. Kanggo gamblang, aku bakal nggunakake generalisasi ing conto . Mulane, aku bakal nulis mung Peta, tanpa nemtokake peta specifier. Nanging sampeyan bisa nganggep yen nilai K lan V bisa dibandhingake, tegese K ngluwihi Comparable lan V uga ngluwihi Comparable .9 Pitakonan Ndhuwur Babagan Peta ing Jawa - 1

0. Ngonversi Peta menyang Dhaptar

Ing Jawa, antarmuka Map nawakake telung jinis koleksi: set kunci, set nilai, lan set nilai kunci. Kabeh mau bisa diowahi dadi Daftar nggunakake konstruktor utawa metode addAll(). Potongan kode ing ngisor iki nuduhake carane nggawe ArrayList saka Peta.

// 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. Loop liwat kabeh nilai ing Peta

Mlaku-mlaku liwat saben pasangan nilai kunci minangka prosedur dhasar sing paling dhasar kanggo lumaku liwat Peta. Ing Jawa, saben pasangan disimpen ing lapangan Peta disebut Map.Entry . Map.entrySet()ngasilake seperangkat nilai kunci, dadi cara sing paling efisien kanggo ngulang kabeh nilai Peta yaiku:

for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
Kita uga bisa nggunakake Iterator, utamané ing versi luwih enom saka 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. Urutan Peta dening Keys

Ngatur Peta miturut tombol minangka prosedur liyane sing umum digunakake. Cara pisanan yaiku nambahake Map.Entry menyang dhaptar, lan ngurutake nggunakake komparator sing diurutake miturut nilai.

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());
  }
});
Cara liya: gunakake SortedMap , sing, saliyane, uga ngatur kunci kanthi urut. Nanging, kabeh tombol kudu ngemot Comparable utawa ditampa dening comparator. Salah sawijining kelas sing ditindakake SortedMapyaiku TreeMap . Konstruktor kasebut nampa komparator. Kode ing ngisor iki nuduhake carane ngowahi sing normal Mapdadi pesenan.

SortedMap sortedMap = new TreeMap(new Comparator() {
 
  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }
 
});
sortedMap.putAll(Map);

3. Urutan Peta miturut Nilai

Nambahake Peta menyang dhaptar banjur ngurutake kerjane ing kasus iki, nanging wektu iki sampeyan kudu nggunakake Entry.getValue(). Kode ing ngisor iki meh padha karo sadurunge.

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());
  }
 
});
Kita isih bisa nggunakake SortedMaping kasus iki, nanging mung yen nilai unik. Ing kasus iki, sampeyan bisa ngowahi pasangan key-value dadi key-value. Solusi iki duwe watesan sing abot lan ora dianjurake dening aku.

4. Initializing a Statis / Peta immutable

Yen sampeyan pengin Peta tetep ora bisa diganti, cara sing apik yaiku nyalin menyang Peta sing ora bisa diganti. Teknik pemrograman pertahanan iki bakal mbantu sampeyan nggawe Peta sing ora mung aman kanggo digunakake, nanging uga aman kanggo benang. Kanggo miwiti Peta statis / ora bisa diganti, kita bisa nggunakake initializer static(ndeleng ngisor). Masalah karo kode iki senadyan nyatakake Peta minangka static final, kita isih bisa karo sawise initialization, contone Test.Map.put(3,"three");,. Dadi dudu immutability nyata. Kanggo nggawe Peta immutable nggunakake initializer statis, kita kudu kelas super anonim, kang bakal ditambahake menyang Peta immutable ing langkah initialization pungkasan. Mangga deleng bagean kapindho kode kasebut. Nalika UnsupportedOperationException bakal dibuwang yen sampeyan mbukak Test.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);
  }
}
Pustaka Guava uga ndhukung macem-macem cara kanggo miwiti koleksi statis lan ora bisa diganti. Kanggo mangerteni sing luwih lengkap babagan keuntungan saka utilitas koleksi immutable Guava, waca bagean Koleksi Immutable ing Guava How-to .

5. Bedane antarane HashMap, TreeMap, lan Hashtable

Ana telung implementasi utama antarmuka Peta ing Jawa: HashMap , TreeMap , lan Hashtable . Bedane utama yaiku kaya ing ngisor iki:
  • Urutan perangan . HashMap lan HashTable ora njamin pesenan Peta; utamané, padha ora njamin sing pesenan bakal tetep padha liwat wektu. Nanging TreeMapbakal supaya kabeh nilai ing "urutan alam" tombol utawa dening comparator.
  • Pasangan kunci-nilai sing valid. HashMapngidini sampeyan duwe tombol null lan nilai null. HashTableora ngidini tombol null utawa nilai null. Yen TreeMapurutan alam digunakake utawa comparator ora ngidini null key, pangecualian bakal di buwang.
  • Sinkronisasi . Mung HashTablediselarasake, liyane ora. Nanging, "yen implementasine aman thread ora dibutuhake, disaranake nggunakake " HashMaptinimbang HashTable.
Perbandingan sing luwih rinci

.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

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

6. Peta kanthi telusuran / tampilan mbalikke

Kadhangkala, kita butuh set pasangan kunci-kunci, sing artine nilai-nilai kasebut unik kaya tombol (pola siji-kanggo-siji). Konsistensi iki ngidini sampeyan nggawe "tampilan / telusuran terbalik" ing Peta. Yaiku, kita bisa nemokake kunci kanthi regane. Struktur data iki diarani Peta bidirectional , sing sayangé ora didhukung dening JDK. Loro-lorone Apache Common Collections lan Guava nawakake implementasi Peta bidirectional sing diarani BidiMap lan BiMap. Loro-lorone ngenalake kendala sing ngetrapake pemetaan 1: 1 antarane tombol lan nilai.

7. Salinan Cethek saka Peta

Meh kabeh, yen ora kabeh, Peta ing Jawa ngemot konstruktor salinan kanggo Peta liyane. Nanging prosedur nyalin ora disinkronake. Tegese yen siji thread nyalin Peta, thread liyane bisa ngganti strukture. Kanggo nyegah desynchronization salinan dadakan, salah sijine kudu digunakake ing kasus kaya mengkono Collections.synchronizedMap().

Map copiedMap = Collections.synchronizedMap(Map);
Cara liyane sing menarik kanggo nyalin kanthi cethek yaiku nggunakake clone(). Nanging ora dianjurake sanajan dening pangripta kerangka koleksi Java, Joshua Bloch. Ing debat " Copy Constructor vs. Cloning ", dheweke njupuk posisi: Kutipan: "Aku kerep nyedhiyakake metode kloning umum ing kelas konkrit amarga wong ngarepake dheweke ana ing kana ... kedaden. ... Kloning minangka titik lemah lan aku mikir wong kudu dielingake babagan watesan kasebut." Mulane, aku malah ora nuduhake sampeyan carane nggunakake cara clone()kanggo nyalin Peta

8. Nggawe Peta kosong

Yen Mapora owah, gunakake:

Map = Collections.emptyMap();
Utawa, gunakake pawujudan liyane. Tuladhane:

Map = new HashMap();
END
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION