জাভায় হ্যাশম্যাপ প্রিন্টিং


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()পদ্ধতির ডকুমেন্টেশন : "এই মানচিত্রে কী-মান ম্যাপিংয়ের সংখ্যাটি ফেরত দেয় the মানচিত্রে যদি Integer.MAX_VALUEউপাদানগুলির চেয়ে বেশি থাকে , প্রত্যাবর্তন হয় Integer.MAX_VALUE।"
অ্যাডাম পেইন্টার

আপনার কোডটি কীগুলিতে মানগুলির সন্ধান করছে - যা সঠিক নয়। হয় কীগুলিতে কী বা মানগুলিতে মান সন্ধান করুন
লাইভ

2
যদি এটির 1 কী / মান থাকে তবে এটির অবশ্যই 1 আকার থাকবে But তবে শূন্য-ভিত্তিক সূচকের সাথে এর কোনও যোগসূত্র নেই।
জেস্পার

এটা একটা ভালো প্রশ্ন। তবে এখানে একটি উত্তর সরবরাহ করা আছে যা এক লাইনে এটি করতে পারে, আপনি যদি মিংফেইয়ের সমাধানটি দেখেন।
হোল্ডঅফহাঙ্গার

উত্তর:


140

কীসেট () কেবল আপনার হ্যাশম্যাপ থেকে কীগুলির একটি সেট দেয়, আপনার এই কী সেটটি পুনরাবৃত্তি করা উচিত এবং এই কীগুলি ব্যবহার করে হ্যাশম্যাপ থেকে মান পাওয়া উচিত।

আপনার উদাহরণে, হ্যাশম্যাপের কী এর ধরণটি রয়েছে TypeKeyতবে আপনি TypeValueআপনার জেনেরিকের জন্য লুপটি নির্দিষ্ট করেছেন, সুতরাং এটি সংকলন করা যায় না। আপনার এটি পরিবর্তন করা উচিত:

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

জাভা 8 এর জন্য আপডেট:

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

আপনার যদি কী মানটি মুদ্রণের প্রয়োজন হয় না এবং কেবল হ্যাশম্যাপ মান প্রয়োজন হয় তবে আপনি অন্যের পরামর্শ ব্যবহার করতে পারেন।

অন্য প্রশ্ন: এই সংগ্রহটি কি শূন্য বেস? মানে এর যদি 1 টি কী থাকে এবং মানটি 0 বা 1 হয়?

সংগ্রহটি keySet()একটি সেট থেকে এসেছে You যদি আপনার হ্যাশম্যাপের একটি কী থাকে তবে কীসেট () ফিরে এসেছে তার ভিতরে একটি প্রবেশ করবে এবং এর আকার হবে 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
এই ক্ষেত্রে এনপিইর বিষয়ে সাবধানতা অবলম্বন করুন যে কারণে আমি .toStringযখন সম্ভব এড়ানো ।
মারউন

সেটা সত্য. এনপিই সর্বদা এ জাতীয় শর্ট কাটগুলিতে লুকিয়ে থাকে। আমি কেবল একটি অনুরূপ পুট প্রদর্শন করতে চেয়েছিলাম .. আমি মনে করি বিশেষত আপনি যখন কোনও লগ / কনসোলে ডিবাগ করছেন এবং আপনি কেবল একটি মানচিত্রে উঁকি দিতে চাইছেন যার তথ্য আপনি নালেন জানেন না। এটি একটি দ্রুত আগুন! তবে যদি এর কোডটি স্ক্র্যাচ থেকে পরীক্ষা করা হয় ... তবে আপনি ঠিক বলেছেন, এর কৌশলটি এবং ভাল প্রোগ্রামিং প্রসঙ্গে, এড়ানো উচিত!
ইয়ো অ্যাপস

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 ডকুমেন্টেশন থেকে আরও তথ্য দ্বারা প্রসারিত

এই মানচিত্রের একটি স্ট্রিং প্রতিনিধিত্ব প্রদান করে। স্ট্রিং প্রতিনিধিত্ব মানচিত্রের এন্ট্রিসেট ভিউ'র পুনরাবৃত্তকারী দ্বারা বক্রবন্ধগুলিতে আবদ্ধ ("{}") দ্বারা প্রত্যাবর্তিত ক্রমে কী-মান ম্যাপিংগুলির একটি তালিকা রয়েছে। সংলগ্ন ম্যাপিংগুলি "," (কমা এবং স্পেস) অক্ষর দ্বারা পৃথক করা হয়। প্রতিটি কী-মান ম্যাপিংকে সংশ্লিষ্ট মান অনুসারে একটি সমান চিহ্ন ("=") অনুসারে কী হিসাবে রেন্ডার করা হয়। কী এবং মানগুলি স্ট্রিং.ওয়ালুওফ (অবজেক্ট) দ্বারা স্ট্রিংয়ে রূপান্তরিত হয়।


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

একটি হ্যাশম্যাপে এন্ট্রিগুলি দ্রুত মুদ্রণ করতে দরকারী

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

1

মানচিত্রটি মান হিসাবে যদি কোনও সংগ্রহ ধারণ করে, অন্য উত্তরের জন্য সেগুলি স্ট্রিং হিসাবে রূপান্তর করতে অতিরিক্ত প্রচেষ্টা প্রয়োজন, যেমন Arrays.deepToString(value.toArray())(যদি এটি তালিকার মানগুলির মানচিত্র), ইত্যাদি etc.

আমি বেশিরভাগ ক্ষেত্রে এই সমস্যার মুখোমুখি হয়েছি এবং সমস্ত বস্তু ব্যবহার করে মুদ্রণের জন্য জেনেরিক ফাংশন জুড়ে এসেছি 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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.