Java, çeşitli kullanışlı yerleşik koleksiyon kitaplıkları sağlar. Ancak bazen Java'nın standart kütüphanesinde yerleşik olmayan özel türde koleksiyonlara ihtiyaç duyduk. Bu koleksiyondan biri de Çoklu Harita . Bu bölümde çoklu haritanın ne olduğunu öğreneceğiz ve Java'da çoklu harita nasıl uygulanır, ve Çoklu harita arayüzü Guava kütüphanesinden.
Java Çoklu Harita
Java'da, Harita anahtarı değerle eşleştirmemizi sağlayan bir veri yapısıdır. Öte yandan, çoklu eşleme, Guava kütüphanesinde bulunan ve tek bir anahtarın birden çok değerle (DBMS'deki bire çok ilişkiler gibi) eşlenmesine olanak tanıyan yeni bir koleksiyon türüdür. Ancak JDK'nın çoklu eşlemeye izin vermediğini unutmayın.
Google'ın Guava kütüphanesini ve Apache Commons Collections kütüphanelerini kullanarak Java'da çoklu haritayı uygulamaya yönelik alternatif çözüm. Her ikisi de Çoklu Harita arayüzünün bir uygulamasını sağlar. Tek bir anahtara birden fazla değer depolayabilir. Koleksiyonda saklanan ve alternatif olarak kabul edilen anahtarlar ve değerler Harita
nbsp
Ancak Google'ın Guava kütüphanesindeki Multimap'i kullanmanın bize pek bir faydası yok. Bunun yerine, Java'da buna göre özelleştirilebilen kendi Multimap sınıfımızı uygulayacağız. Java'da Çoklu Harita sınıfı yazmak kolaydır.
Aşağıdaki Java programı, Multimap sınıfının Java'da Harita ve koleksiyon kullanılarak uygulanmasını göstermektedir.
Java Çoklu Harita Uygulaması
Çoklu HaritaÖrneği.java
Java'da int'ye dize
import java.util.*; class MultiMap { //creating a map of key and value (collection) private Map<k, collection> map = new HashMap(); //add the specified value with the specified key in this multimap public void put(K key, V value) { if (map.get(key) == null) { map.put(key, new ArrayList()); } map.get(key).add(value); } //associate the specified key with the given value if not already associated with a value public void putIfAbsent(K key, V value) { if (map.get(key) == null) { map.put(key, new ArrayList()); } // if the value is absent, insert it if (!map.get(key).contains(value)) { map.get(key).add(value); } } //the method returns the Collection of values to which the specified key is mapped, or null if this multimap contains no mapping for the key public Collection get(Object key) { return map.get(key); } //the method returns a set view of the keys contained in this multimap public Set keySet() { return map.keySet(); } //the method returns a set view of the mappings contained in this multimap public Set<map.entry<k, collection>> entrySet() { return map.entrySet(); } //the method returns a Collection view of Collection of the values present in this multimap public Collection<collection> values() { return map.values(); } //Returns true if this multimap contains a mapping for the specified key. public boolean containsKey(Object key) { return map.containsKey(key); } //Removes the mapping for the specified key from this multimap if present and returns the Collection of previous values associated with the key, or null if there was no mapping for key public Collection remove(Object key) { return map.remove(key); } //Returns the total number of key-value mappings in this multimap. public int size() { int size = 0; for (Collection value: map.values()) { size += value.size(); } return size; } //Returns true if this multimap contains no key-value mappings. public boolean isEmpty() { return map.isEmpty(); } //Removes all the mappings from this multimap. public void clear() { map.clear(); } //Removes the entry for the specified key only if it is currently mapped to the specified value and returns true if removed public boolean remove(K key, V value) { if (map.get(key) != null) // key exists return map.get(key).remove(value); return false; } //Replaces the entry for the specified key only if currently mapped to the specified value and return true if replaced public boolean replace(K key, V oldValue, V newValue) { if (map.get(key) != null) { if (map.get(key).remove(oldValue)) { return map.get(key).add(newValue); } } return false; } } //main class public class MultimapExample { //main method public static void main(String args[]) { //Creating a multimap of type String MultiMap multimap = new MultiMap(); //adding values to the multimap multimap.put('a', 'Andrew'); multimap.put('b', 'Albert'); multimap.put('b', 'Tom'); multimap.put('d', 'Sam'); multimap.put('d', 'Reo'); multimap.put('g', 'Jack'); multimap.put('g', 'David'); System.out.println('----- Printing Multimap using keySet ----- '); //loop iterate over multimap for (String lastName: multimap.keySet()) { //printing key and values System.out.println(lastName + ': ' + multimap.get(lastName)); } } } </collection></map.entry<k,></k,>
Çıktı:
----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David]
Google'ın Guava Kitaplığını Kullanma
Çoklu Harita arayüz şurada tanımlanmıştır com.google.common.collect Guava kütüphanesinin paketi. Aşağıdaki gibi adlandırılan birçok sınıfı uygular:
ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.
Sözdizimi:
@GwtCompatible public interface Multimap
Anahtarları değerlerle eşleyen bir koleksiyon (Haritadakiyle aynı), ancak her anahtar birden fazla değerle ilişkilendirilebilir. Çoklu haritanın içeriğini anahtarlardan boş olmayan değer koleksiyonlarına kadar bir harita olarak görselleştirebiliriz. Örneğin:
- X → 1, 2
- Y → 3
veya
farklı sql'yi say
- X → 1
- X → 2
- Y → 3
Java Çoklu Harita Arayüzü Yöntemleri
Yöntem | Tanım |
---|---|
harita olarak() | Bu çoklu haritanın görünümünü, her bir farklı anahtardan, o anahtarın ilişkili değerlerinin boş olmayan koleksiyonuna bir Harita olarak döndürür. |
temizlemek() | Çoklu haritadaki tüm anahtar/değer çiftlerini kaldırır ve boş bırakır. |
includeEntry(Nesne anahtarı, Nesne değeri) | Bu çoklu eşleme, anahtar ve değerle birlikte en az bir anahtar/değer çifti içeriyorsa true değerini döndürür. |
içerirKey(Nesne anahtarı) | Bu çoklu eşleme, anahtarla birlikte en az bir anahtar/değer çifti içeriyorsa true değerini döndürür. |
içerirValue(Nesne değeri) | Bu çoklu eşlem, değere sahip en az bir anahtar/değer çifti içeriyorsa true değerini döndürür. |
girdileri() | Bu çoklu haritada bulunan tüm anahtar/değer çiftlerinin bir görünüm koleksiyonunu Map.Entry örnekleri olarak döndürür. |
eşittir(Nesne nesnesi) | Eşitlik açısından belirtilen nesneyi bu çoklu haritayla karşılaştırır. |
forEach(BiConsumer eylemi) | Bu çoklu haritada bulunan tüm anahtar/değer çiftleri için verilen eylemi gerçekleştirir. |
al(K tuşu) | Varsa, bu çoklu haritadaki anahtarla ilişkili değerlerin bir görünüm koleksiyonunu döndürür. |
hash kodu() | Bu çoklu haritanın karma kodunu döndürür. |
boş() | Bu çoklu eşlem hiçbir anahtar/değer çifti içermiyorsa true değerini döndürür. |
anahtarlar() | Kopyaları daraltmadan, bu çoklu haritadaki her anahtar/değer çiftinin anahtarını içeren bir görünüm koleksiyonu döndürür. |
anahtar seti() | Bu çoklu haritada bulunan tüm farklı anahtarların bir görünüm koleksiyonunu döndürür. |
put(K tuşu, V değeri) | Bu çoklu haritada bir anahtar/değer çiftini saklar. |
putAll(K tuşu, Yinelenebilir değerler) | Bu çoklu haritada her bir değer için bir anahtar/değer çifti depolar ve hepsi aynı anahtarı kullanır. |
putAll(Çoklu harita çoklu harita) | Bu çoklu haritadaki çoklu haritanın tüm anahtar/değer çiftlerini, multimap.entries() tarafından döndürülen sıraya göre saklar. |
kaldır(Nesne anahtarı, Nesne değeri) | Varsa, bu çoklu haritadaki anahtar ve değer ile tek bir anahtar/değer çiftini kaldırır. |
Tümünü kaldır(Nesne anahtarı) | Anahtarla ilişkili tüm değerleri kaldırır. |
replacementValues(K tuşu, Yinelenebilir değerler) | Aynı anahtara sahip bir değerler koleksiyonunu saklar ve bu anahtar için mevcut değerlerin yerini alır. |
boyut() | Bu çoklu haritadaki anahtar/değer çiftlerinin sayısını döndürür. |
değerler() | Bu çoklu haritada bulunan her bir anahtar/değer çiftinin değerini içeren bir görünüm koleksiyonunu, kopyaları daraltmadan döndürür (yani,values().size() == size()). |