Java'da HashMap Yazdırma


129

Bende HashMap:

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

Şimdi tüm değerleri incelemek ve onları yazdırmak istiyorum.

Bunu ben yazdım:

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

İşe yaramıyor gibi görünüyor.

Sorun nedir?

DÜZENLEME: Başka bir soru: Bu koleksiyon sıfır tabanlı mı? Demek istediğim, eğer 1 anahtarı varsa ve değeri boyut 0 mı yoksa 1 mi olacak?


2
Java'nın belgelerine aşina olmanızı tavsiye ederim (birçok sorunuza cevap verecektir). Örneğin, bu belgeleri olan Mapbireyin size()bir yöntem : 'döndürür, bu harita anahtar değeri eşlemeler sayısı haritasını daha fazla içeriyorsa Integer.MAX_VALUEelemanları, geri dönüş Integer.MAX_VALUE.'
Adam Paynter

Kodunuz Anahtarlardaki Değerleri arıyor - ki bu doğru değil. Anahtarlarda anahtarı veya Değerler'de değeri arayın
d-live

2
Eğer 1 anahtar / değer varsa, tabii ki boyutu 1 olacaktır. Ancak bunun sıfır tabanlı indekslemeyle ilgisi yoktur.
Jesper

Bu güzel bir soru. Ancak Mingfei'nin çözümünü görürseniz, burada bunu tek satırda yapabilecek bir cevap var.
HoldOffHunger

Yanıtlar:


140

keySet () yalnızca hashmap'inizden bir dizi anahtar döndürür, bu anahtar kümesini yinelemelisiniz ve bu anahtarları kullanarak hashmap'ten değeri almalısınız.

Örneğinizde, hashmap anahtarının türü TypeKey, ancak TypeValuejenerik for-loop'unuzda belirttiğiniz için derlenemez. Bunu şu şekilde değiştirmelisiniz:

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Java8 için güncelleme:

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

Anahtar değerini yazdırmanız gerekmiyorsa ve yalnızca hashmap değerine ihtiyacınız varsa, başkalarının önerilerini kullanabilirsiniz.

Başka bir soru: Bu koleksiyon sıfır tabanlı mı? Demek istediğim, eğer 1 anahtarı varsa ve değeri 0 mı, 1 mi olacak?

Döndürülen koleksiyonu keySet()bir olan Set o sıfır tabanlı veya tek merkezli olup olmadığı bir soru değil bu yüzden .Arzu, bir dizin kullanarak bir Kümesinden değer elde edilemez. Karma haritanızın bir anahtarı varsa, döndürülen keySet () içinde bir giriş olur ve boyutu 1 olur.


19
Ya da daha iyisi:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
Ya da daha kompakt: example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

94

Anahtar değer çiftlerini görmenin basit bir yolu:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

Hem yöntem 1 hem de yöntem 2 şunu verir:

[{b=2, a=1}]

21
Şu şekilde yapın:, System.out.println(map);çıktı:{b=2, a=1}
Mingfei

Evet ... benzer bir çıktı daha:System.out.println(map.toString());
Yo Apps

1
@yoapps bu durumda NPE'ye dikkat edin. Bu yüzden .toStringmümkün olduğunda kaçınıyorum .
Maroun

Bu doğru. NPE her zaman bu tür kısa yollarda pusuda. Ben sadece benzer bir sonuç göstermek istedim .. Özellikle bir günlükte / konsola hata ayıklama yaparken ve verilerinin boş olmadığını bildiğiniz bir haritaya göz atmak istediğinizde düşünüyorum. bu hızlı bir ateş! Ama eğer kodu sıfırdan kontrol ediyorsa ... o zaman haklısın, karmaşık ve iyi bir programlama bağlamında, bundan kaçınılmalıdır!
Yo Apps

40

Bir sahip olduğunuzu varsayarsak Map<KeyType, ValueType>, şu şekilde yazdırabilirsiniz:

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

Hem anahtarı hem de değeri yazdırmak için aşağıdakileri kullanın:

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
3. satırda noktalı virgülden önce başka bir parantez eksik.
nktsamba


9

Değer setini istiyorsunuz, anahtar setini değil:

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

Verdiğiniz kod derlenmez bile, ki bu gelecekteki sorularda bahsetmeye değer olabilir - "işe yaramıyor gibi görünüyor" biraz belirsizdir!


8

Java 8 yaklaşımından BiConsumerve lambda işlevlerinden bahsetmeye değer :

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

toStringGerekirse iki türün yöntemini geçersiz kıldığınızı varsayarsak .


7

Benim için bu basit tek satır iyi çalıştı:

Arrays.toString(map.entrySet().toArray())

6

Karma Haritanın referansını içeren değişken adına sahip basit bir print ifadesi şunları yapacaktır:

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

Bu işe yarar, çünkü toString()yöntem zaten geçersizdir, AbstractMap classburada HashMap Class daha fazla bilgi dokümantasyonuyla genişletilmiştir.

Bu haritanın dize gösterimini döndürür. Dize temsili, eşlemenin entrySet görünümünün yineleyicisi tarafından döndürülen sırayla, parantez ("{}") içine alınmış anahtar-değer eşlemelerinin bir listesinden oluşur. Bitişik eşlemeler "," (virgül ve boşluk) karakterleriyle ayrılır. Her bir anahtar / değer eşlemesi, anahtar olarak oluşturulur ve ardından bir eşittir işareti ("=") ve ardından ilişkili değer gelir. Anahtarlar ve değerler String.valueOf (Object) ile olduğu gibi dizelere dönüştürülür.


2
bu yukarıdakilerden en iyi cevap gibi görünüyor.
Karan Ahuja

5

Java 8 yeni özellik forEachstili

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

String map kullanarak yaptım (String Map ile çalışıyorsanız).

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Java 8 özelliklerini kullanma


3
Bu kod soruyu çözebilirken, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere , gönderinizin kalitesini artırmaya gerçekten yardımcı olur ve muhtemelen daha fazla oy almanıza neden olur. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın. Lütfen açıklama eklemek için yanıtınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğuna dair bir gösterge verin.
Dave

2

Bir HashMap'teki girişleri hızlı bir şekilde yazdırmak için kullanışlıdır

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

Harita değer olarak bir koleksiyon tutuyorsa, diğer yanıtlar onları dizge olarak dönüştürmek için ek çaba gerektirir, örneğin Arrays.deepToString(value.toArray())(liste değerlerinin bir haritası ise) vb.

Bu sorunlarla oldukça sık karşılaştım ve tüm nesneleri kullanarak yazdırmak için genel işlevle karşılaştım ObjectMappers. Bu, özellikle deneyler sırasında her yerde oldukça kullanışlıdır ve bu yolu seçmenizi tavsiye ederim.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

0

Kolayca Entryokumak için sınıfı kullanabilirsiniz HashMap.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.