जावा में प्रिंटिंग हैशपॉप


129

मेरे पास एक है HashMap:

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

अब मैं सभी मूल्यों के माध्यम से चलना और उन्हें प्रिंट करना चाहूंगा।

मैंने यह लिखा:

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

यह काम करने के लिए प्रतीत नहीं होता है।

समस्या क्या है?

संपादित करें: एक और सवाल: क्या यह संग्रह शून्य आधारित है? मेरा मतलब है कि अगर यह 1 कुंजी है और मूल्य 0 या 1 होगा?


2
मैं आपको जावा के प्रलेखन से परिचित होने की सलाह देता हूं (यह आपके कई सवालों के जवाब देगा)। उदाहरण के लिए, इस के लिए दस्तावेज़ है Mapकी size()विधि : "। रिटर्न इस नक्शे में मुख्य मान मैपिंग की संख्या नक्शे की तुलना में अधिक हैं, तो Integer.MAX_VALUEतत्वों, रिटर्न Integer.MAX_VALUE।"
एडम पेन्नर

आपका कोड कुंजी में मानों की तलाश कर रहा है - जो सही नहीं है। या तो मूल्यों में कुंजी की तलाश करें या मान में
d-live

2
यदि इसमें 1 कुंजी / मान है तो इसका आकार 1 होगा। लेकिन इसका शून्य-आधारित अनुक्रमण से कोई लेना-देना नहीं है।
जेस्पर

यह अच्छा प्रश्न है। लेकिन यहां एक उत्तर दिया गया है जो एक पंक्ति में ऐसा कर सकता है, यदि आप मिंगफेई का समाधान देखते हैं।
होल्डऑफहिंगर

जवाबों:


140

keySet () आपके हैशमैप से केवल कुंजी का एक सेट देता है, आपको इस कुंजी को सेट करना चाहिए और इन कुंजियों का उपयोग करके हैशमैप से मान प्राप्त करना चाहिए।

आपके उदाहरण में, हैशमैप की कुंजी है TypeKey, लेकिन आपने TypeValueअपने जेनेरिक फॉर-लूप में निर्दिष्ट किया है, इसलिए इसे संकलित नहीं किया जा सकता है। आपको इसे बदलना चाहिए:

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

Java8 के लिए अपडेट करें:

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

यदि आपको कुंजी मूल्य प्रिंट करने की आवश्यकता नहीं है और बस हैशमैप मूल्य की आवश्यकता है, तो आप दूसरों के सुझावों का उपयोग कर सकते हैं।

एक और सवाल: क्या यह संग्रह शून्य आधार है? मेरा मतलब है कि अगर इसकी 1 कुंजी है और क्या इसका आकार 0 या 1 होगा?

से लौटा हुआ संग्रह keySet()एक सेट है । आप एक इंडेक्स का उपयोग करके सेट से मान प्राप्त नहीं कर सकते हैं, इसलिए यह सवाल नहीं है कि यह शून्य-आधारित है या एक-आधारित है। यदि आपके हैशमैप में एक कुंजी है, तो कीसेट () में एक प्रविष्टि अंदर होगी, और उसका आकार 1 होगा।


19
या अभी तक बेहतर:for (Map.Entry<String, String> entry : map.entrySet()) { ... }
एडम पेन्नर

2
या इससे भी अधिक कॉम्पैक्ट: example.forEach((key, value) -> System.out.println("key + " | " + value));
यूनुस ईओ

93

मुख्य मूल्य जोड़े को देखने का एक सरल तरीका:

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

दोनों विधि 1 और विधि 2 इसका उत्पादन करते हैं:

[{b=2, a=1}]

21
बस के रूप में करते हैं: System.out.println(map);उत्पादन:{b=2, a=1}
मिंगफेई

हाँ ... इसी तरह का एक और आउटपुट:System.out.println(map.toString());
यो एप्स

1
@yoapps इस मामले में NPE से सावधान रहें। इसलिए मैं .toStringजब संभव हो बचता हूं ।
मारून

यह सच है। NPE हमेशा इस तरह के शॉर्ट कट में रहता है। मैं केवल एक समान आउट दिखाना चाहता था .. मुझे लगता है कि विशेष रूप से जब आप लॉग / कंसोल पर डिबगिंग कर रहे हों और आप केवल एक मैप में झांकना चाहते हों, जिसका डेटा आपको पता नहीं है। यह एक त्वरित आग है! लेकिन अगर इसका कोड खरोंच से जाँच रहा है ... तो आप सही हैं, इसकी मुश्किल और अच्छी प्रोग्रामिंग संदर्भ में, इसे टाला जाना चाहिए!
यो एप्स

40

मान लें कि आपके पास एक है Map<KeyType, ValueType>, तो आप इसे इस तरह से प्रिंट कर सकते हैं:

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

16

कुंजी और मान दोनों को प्रिंट करने के लिए, निम्नलिखित का उपयोग करें:

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

1
तीसरी पंक्ति पर अर्ध उपनिवेश से पहले आपको एक और ब्रैकेट याद आ रहा है।
nktsamba

13

आपके पास कई विकल्प हैं

  • जाओ map.values(), जिसे मूल्य मिलते हैं, चाबी नहीं
  • जाओ map.entrySet()है जो दोनों
  • keySet()प्रत्येक कुंजी कॉल के लिए और प्राप्त करेंmap.get(key)

9

आप मान सेट चाहते हैं, कुंजी सेट नहीं:

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

आपके द्वारा दिया गया कोड भी संकलित नहीं होगा, जो भविष्य के प्रश्नों में ध्यान देने योग्य हो सकता है - "काम नहीं करता है" थोड़ा अस्पष्ट है!


8

जावा 8 दृष्टिकोण का उल्लेख करते हुए, BiConsumerलाम्दा कार्यों का उपयोग करते हुए :

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

example.forEach(consumer);

यह मानते हुए कि toStringयदि आवश्यक हो तो आपने दो प्रकार की विधि को अधिलेखित कर दिया है ।


7

मेरे लिए यह सरल एक पंक्ति अच्छी तरह से काम करती है:

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

6

चर नाम के साथ एक साधारण प्रिंट स्टेटमेंट जिसमें हैश मैप का संदर्भ होता है:

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

यह काम करता है क्योंकि toString()विधि पहले से ही ओवर-राइड है AbstractMap classजिसमें HashMap Class प्रलेखन से अधिक जानकारी द्वारा विस्तारित किया गया है

इस नक्शे का एक स्ट्रिंग प्रतिनिधित्व लौटाता है। स्ट्रिंग के प्रतिनिधित्व में कुंजी-मूल्य मैपिंग की एक सूची होती है, जो नक्शे के एंट्रीसेट व्यू के इट्रेटर द्वारा लौटाया जाता है, ब्रेसिज़ में संलग्न होता है ("{}")। आसन्न मैपिंग वर्ण "," (अल्पविराम और स्थान) द्वारा अलग किए जाते हैं। प्रत्येक कुंजी-मान मानचित्रण को संबंधित मान के बाद बराबर चिह्न ("=") के बाद कुंजी के रूप में प्रदान किया जाता है। कुंजी और मान स्ट्रिंग्स में बदलकर String.valueOf (ऑब्जेक्ट) के रूप में होते हैं।


2
यह ऊपर वाले से सबसे अच्छा जवाब लगता है।
करण आहूजा

5

जावा 8 नई सुविधा forEachशैली

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

मैंने इसे स्ट्रिंग मैप का उपयोग किया (यदि आप स्ट्रिंग मैप के साथ काम कर रहे हैं)।

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));

जावा 8 सुविधाओं का उपयोग करना


3
हालांकि यह कोड प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
डेव

2

HashMap में प्रविष्टियों को जल्दी से प्रिंट करने के लिए उपयोगी

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

1

यदि मानचित्र मान के रूप में एक संग्रह रखता है, तो अन्य उत्तरों को उन्हें स्ट्रिंग के रूप में परिवर्तित करने के लिए अतिरिक्त प्रयास की आवश्यकता होती है, जैसे Arrays.deepToString(value.toArray())(यदि इसकी सूची मानों का नक्शा), आदि।

मैंने इन मुद्दों का अक्सर सामना किया और सभी वस्तुओं का उपयोग करने के लिए मुद्रित करने के लिए सामान्य कार्य में आया ObjectMappers। यह सभी स्थानों पर काफी उपयोगी है, खासकर चीजों को प्रयोग करने के दौरान, और मैं आपको इस तरह से चुनने की सलाह दूंगा।

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

आप आसानी Entryसे पढ़ने के लिए कक्षा का उपयोग कर सकते HashMapहैं।

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.