জাভাতে একটি মানচিত্র প্রিন্ট করুন


136

আমি একটি প্রশংসনীয়-প্রিন্ট করতে একটা চমৎকার উপায় খোঁজ করছি Map

map.toString() আমাকে দেয়: {key1=value1, key2=value2, key3=value3}

আমি আমার মানচিত্রে প্রবেশের মানগুলিতে আরও স্বাধীনতা চাই এবং এর মতো আরও কিছু খুঁজছি: key1="value1", key2="value2", key3="value3"

আমি এই ছোট্ট কোডটি লিখেছি:

StringBuilder sb = new StringBuilder();
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Entry<String, String> entry = iter.next();
    sb.append(entry.getKey());
    sb.append('=').append('"');
    sb.append(entry.getValue());
    sb.append('"');
    if (iter.hasNext()) {
        sb.append(',').append(' ');
    }
}
return sb.toString();

তবে আমি নিশ্চিত যে এটি করার আরও একটি মার্জিত এবং সংক্ষিপ্ত উপায় রয়েছে।


1
জাভাতে মানচিত্রে স্ট্রিংয়ের সম্ভাব্য সদৃশ কারণ এখানে অনুরোধ করা ফর্ম্যাটটি System.out.printlnখুব কাছে রয়েছে close এবং যদি আপনি কিছু কাস্টম চান তবে এটি "জাভাতে কোনও মানচিত্রের উপরে কীভাবে পুনরাবৃত্তি করবেন" -এ উত্সাহিত হয় যার অবশ্যই অন্যান্য অনেক উত্তর রয়েছে।
সিরো সান্তিলি :4 冠状 病 六四 事件 法轮功

উত্তর:


63

অথবা আপনার যুক্তি একটি পরিপাটি সামান্য ক্লাসে রাখুন।

public class PrettyPrintingMap<K, V> {
    private Map<K, V> map;

    public PrettyPrintingMap(Map<K, V> map) {
        this.map = map;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        Iterator<Entry<K, V>> iter = map.entrySet().iterator();
        while (iter.hasNext()) {
            Entry<K, V> entry = iter.next();
            sb.append(entry.getKey());
            sb.append('=').append('"');
            sb.append(entry.getValue());
            sb.append('"');
            if (iter.hasNext()) {
                sb.append(',').append(' ');
            }
        }
        return sb.toString();

    }
}

ব্যবহার:

Map<String, String> myMap = new HashMap<String, String>();

System.out.println(new PrettyPrintingMap<String, String>(myMap));

দ্রষ্টব্য: আপনি সেই যুক্তিটিকে কোনও ইউটিলিটি পদ্ধতিতেও রাখতে পারেন।


3
এটি একটি বিরোধী imho। আপনি কেবল ক্ষুদ্র সুবিধার জন্য (সুন্দর মুদ্রণ) আপনার প্রকারে একটি শক্ত প্রতিবন্ধকতা (উত্তরাধিকার) যুক্ত করুন। আপনি একটি নিয়মিত মানচিত্র ব্যবহার করা ভাল, কিন্তু একটি স্থির পদ্ধতি ব্যবহার করুন যে এটি একটি যুক্তি হিসাবে গ্রহণ করে।
ওডেলিলি

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

11
আপনার কাছে এতটা ভাল না হলে আপনি Map<String, Map<String,double[]>>এই ধরণের স্টিং পাবেন:[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
zygimantus

2
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এর মতো সহজ কাজগুলির জন্য বাহ্যিক নির্ভরতার প্রয়োজন হবে না। উপরে উল্লিখিত হিসাবে, আরও জটিল মানচিত্রগুলি এ থেকে সহজেই উপকৃত হয় না।
শাদোনিনজা


34

আপাচে পাঠাগারগুলো উদ্ধার!

MapUtils.debugPrint(System.out, "myMap", map);

আপনার সমস্ত প্রয়োজন অ্যাপাচি কমন্স-সংগ্রহ লাইব্রেরি ( প্রকল্পের লিঙ্ক )

ম্যাভেন ব্যবহারকারীরা এই নির্ভরতা ব্যবহার করে লাইব্রেরি যুক্ত করতে পারেন:

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

এটি মানচিত্রের মানগুলি (উদাহরণস্বরূপ Map<String, String[]>) হিসাবে অ্যারেগুলি পরিচালনা করে না । কেবলমাত্র তাদের শ্রেণীর নাম এবং হ্যাশ প্রকৃত মানগুলির পরিবর্তে মুদ্রিত হয়।
পেটর zjezdský

বা লগ.দেবগ ("মানচিত্র: {}", MapUtils.toProperties (মানচিত্র));
চার্লব

1
এছাড়াও ম্যাপুটিলস.ভারবোস মুদ্রণ হস্তে কার্যকর, যা প্রতিটি মূল্যকে ডিবাগপ্রিন্ট আউটপুটগুলির পরে শ্রেণীর নাম বাদ দেবে।
ocarlsen

16

সহজ এবং সহজ। JSON বিশ্বে আপনাকে স্বাগতম। গুগলের জিসন ব্যবহার :

new Gson().toJson(map)

3 টি কী সহ মানচিত্রের উদাহরণ:

{"array":[null,"Some string"],"just string":"Yo","number":999}

15

আমার যখন org.json.JSONObjectক্লাসপথে থাকে তখন আমি করি:

Map<String, Object> stats = ...;
System.out.println(new JSONObject(stats).toString(2));

(এটি সুন্দরভাবে তালিকাভুক্ত তালিকা, সেট এবং মানচিত্র যা নেস্টেড হতে পারে)


1
মানুষ!! তুমি এখানে কি করছ? আপনার শীর্ষ উত্তর হওয়া উচিত!
আমাগিক


9

জাভা 8 স্ট্রিম ব্যবহার করে:

Map<Object, Object> map = new HashMap<>();

String content = map.entrySet()
                    .stream()
                    .map(e -> e.getKey() + "=\"" + e.getValue() + "\"")
                    .collect(Collectors.joining(", "));

System.out.println(content);

2
আপনি যদি কোনও প্রশ্নের নেক্রোতে যাচ্ছেন তবে কমপক্ষে এটির সঠিক উত্তর দিন! আপনি মানটির চারপাশে উদ্ধৃতিগুলি মিস করছেন এবং এটি ব্যবহার করে যোগ দেওয়া উচিত,
অজাহানচর্লস

8

আমি মানচিত্রে এটি JSON স্ট্রিংয়ে রূপান্তর করতে পছন্দ করি:

  • একটি মান
  • মানব পাঠযোগ্য
  • সিনট্যাক্স হাইলাইটিং, ফর্ম্যাটিং এবং বিভাগ লুকান / শো সহ সাবলাইম, ভিএস কোডের মতো সম্পাদকগুলিতে সমর্থিত
  • জেপথকে সমর্থন করে যাতে সম্পাদকরা আপনি যে অবজেক্টে নেভিগেট করেছেন তার ঠিক কোন অংশে রিপোর্ট করতে পারে
  • বস্তুর মধ্যে নেস্টেড জটিল ধরণের সমর্থন করে

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public static String getAsFormattedJsonString(Object object)
    {
        ObjectMapper mapper = new ObjectMapper();
        try
        {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
        }
        catch (JsonProcessingException e)
        {
            e.printStackTrace();
        }
        return "";
    }

4

ওপেনজেডিকে সূত্রগুলির জন্য HashMap#toString()এবং AbstractMap#toString()এর জন্য কোডটি দেখুন :

class java.util.HashMap.Entry<K,V> implements Map.Entry<K,V> {
       public final String toString() {
           return getKey() + "=" + getValue();
       }
   }
 class java.util.AbstractMap<K,V> {
     public String toString() {
         Iterator<Entry<K,V>> i = entrySet().iterator();
         if (! i.hasNext())
            return "{}";

        StringBuilder sb = new StringBuilder();
        sb.append('{');
        for (;;) {
            Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            sb.append(key   == this ? "(this Map)" : key);
            sb.append('=');
            sb.append(value == this ? "(this Map)" : value);
            if (! i.hasNext())
                return sb.append('}').toString();
            sb.append(", ");
        }
    }
}

সুতরাং ওপেনজেডিকে থেকে আসা ছেলেরা যদি এটি করার জন্য আরও মার্জিত উপায় না খুঁজে পায় তবে কিছুই নেই :-)


3

আপনি যা করতে চান তা করতে সক্ষম হবেন:

System.out.println(map) উদাহরণ স্বরূপ

যতক্ষণ না মানচিত্রে আপনার সমস্ত বস্তু আপনি যে toStringপদ্ধতিটি দেখবেন তার চেয়ে বেশি হয়েছে:
{key1=value1, key2=value2}অর্থপূর্ণ উপায়ে

এটি যদি আপনার কোডের জন্য হয় তবে ওভারাইডিং toStringকরা একটি ভাল অভ্যাস এবং আমি আপনাকে পরিবর্তে এর জন্য যাওয়ার পরামর্শ দিই।

আপনার উদাহরণের জন্য যেখানে আপনার অবজেক্টগুলি আপনার Stringঅন্য কোনও কিছু ছাড়াই ভাল হওয়া উচিত।
অর্থাৎ System.out.println(map)কোনও অতিরিক্ত কোড ছাড়াই আপনার যা প্রয়োজন ঠিক তা মুদ্রণ করবেন


1
তার কী এবং মানগুলি স্ট্রিং; আমি মনে করি তিনি টব স্ট্রিং পদ্ধতিটি কভার্ড টিবিএইচ পেয়েছেন।
টম

আপনি ঠিক আছে, কিন্তু সম্ভবত তিনি একটি তুচ্ছ উদাহরণ কপি তার point.But আমি আপডেট উত্তর করতে
Cratylus

হ্যাঁ, আমার নির্দেশ করা উচিত ছিল যে আমার মানচিত্রটি মানচিত্র <স্ট্রিং, স্ট্রিং>। তবে আমি এটিও ইঙ্গিত করেছিলাম যে আমি আমার প্রবেশ মূল্যগুলিতে আরও স্বাধীনতা চাই, উদাহরণস্বরূপ একটি এন্ট্রির মানের মধ্যে কমা দ্বারা পৃথক করা তালিকা having সুতরাং Map.toString () করবে না।
space_monkey

ইন্টারফেসের সম্পর্কিত java.util.Mapকোনও চুক্তি নেই toString(), সুতরাং -> -> -> কি কারণ হবে Mapতা বাস্তবায়ন to এটি ঘটে যে প্রায়শই ব্যবহৃত এটির জন্য একটি দুর্দান্ত স্ট্রিং প্রতিনিধিত্ব করে । ... অন্যান্য বাস্তবায়নগুলি আবার পিছিয়ে পড়তে পারে , যার ফলস্বরূপ তথ্যহীন নয় । System.out.println(map)PrintStream.println(map)String.valueOf(map)map.toString()java.util.AbstractMaptoString()MapObject.toString()com.example.MyMap@4e8c0de
আব্দুল

2
public void printMapV2 (Map <?, ?> map) {
    StringBuilder sb = new StringBuilder(128);
    sb.append("{");
    for (Map.Entry<?,?> entry : map.entrySet()) {
        if (sb.length()>1) {
            sb.append(", ");
        }
        sb.append(entry.getKey()).append("=").append(entry.getValue());
    }
    sb.append("}");
    System.out.println(sb);
}

0

আমার ধারণা এই জাতীয় কিছু পরিষ্কার হবে এবং আউটপুট ফর্ম্যাটটির সাথে আপনাকে আরও নমনীয়তা সরবরাহ করবে (কেবলমাত্র টেম্পলেট পরিবর্তন করুন):

    String template = "%s=\"%s\",";
    StringBuilder sb = new StringBuilder();
    for (Entry e : map.entrySet()) {
        sb.append(String.format(template, e.getKey(), e.getValue()));
    }
    if (sb.length() > 0) {
        sb.deleteCharAt(sb.length() - 1); // Ugly way to remove the last comma
    }
    return sb.toString();

আমি জানি শেষ কমাটি অপসারণ করা কুৎসিত, তবে আমি মনে করি এটি সমাধানের মতো বিকল্প হিসাবে বা ম্যানুয়ালি একটি পুনরায় ব্যবহারকারীর ব্যবহারের চেয়ে এটি পরিষ্কার ।


0

একটি দ্রুত এবং ময়লা সমাধান উপজীব্য বিদ্যমান অবকাঠামো হিসাবে, আপনি মোড়ানো পারেন আপনার uglyPrintedMapএকটি মধ্যে java.util.HashMap, তারপর ব্যবহার toString()

uglyPrintedMap.toString(); // ugly
System.out.println( uglyPrintedMap ); // prints in an ugly manner

new HashMap<Object, Object>(jobDataMap).toString(); // pretty
System.out.println( new HashMap<Object, Object>(uglyPrintedMap) ); // prints in a pretty manner

0

প্রশ্নের ঠিক উত্তর দেয় না, তবে এটি লম্বোডোক @ToString টীকাটি উল্লেখ করার মতো । আপনার সাথে টীকা তাহলে ক্লাস, তারপর করছেন অর্থপূর্ণ কিছু ফিরে আসবে।@ToStringkey / valueSystem.out.println(map)

এটি মানচিত্রের মানচিত্রের সাথে খুব ভাল কাজ করে, উদাহরণস্বরূপ: Map<MyKeyClass, Map<String, MyValueClass>>হিসাবে মুদ্রিত হবে

{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }


0

String result = objectMapper.writeValueAsString(map) - এই হিসাবে সহজ!

ফলাফল:

{"2019-07-04T03:00":1,"2019-07-04T04:00":1,"2019-07-04T01:00":1,"2019-07-04T02:00":1,"2019-07-04T13:00":1,"2019-07-04T06:00":1 ...}

পিএস আপনার ক্লাসপথে জ্যাকসন জেএসনকে যুক্ত করুন।


0

জাভা 8 যেহেতু লাম্বদা দিয়ে এটি করার সহজ উপায় রয়েছে:

yourMap.keySet().forEach(key -> {
    Object obj = yourMap.get(key);
    System.out.println( obj);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.