জাভা সংগ্রহগুলি সুন্দরভাবে মুদ্রণ করা (টুস্ট্রিং সুন্দর আউটপুট ফেরত না)


211

আমি একটি Stack<Integer>বস্তু যেমন খুব সহজেই একিলিপস ডিবাগারের (যেমন [1,2,3...]) মুদ্রণ করতে চাই তবে এটি দিয়ে মুদ্রণ করা out = "output:" + stackভাল ফলাফলটি দেয় না।

কেবল স্পষ্ট করে বলার জন্য, আমি জাভা অন্তর্নির্মিত সংগ্রহের কথা বলছি যাতে আমি এটির ওভাররাইড করতে পারি না toString()

আমি কীভাবে স্ট্যাকের একটি দুর্দান্ত মুদ্রণযোগ্য সংস্করণ পেতে পারি?


7
অন্তত জাভা 7 হিসাবে, AbstractCollection@toString(এবং এইভাবে String + Stack) ইতিমধ্যে এটি প্রিন্ট করে আপনি এটি চান।
সিরো সান্তিলি :0 冠状 病 六四 事件 法轮功

উত্তর:


317

আপনি এটিকে একটি অ্যারেতে রূপান্তর করতে পারেন এবং তারপরে এটি মুদ্রণ করতে পারেন Arrays.toString(Object[]):

System.out.println(Arrays.toString(stack.toArray()));

11
আমি এটা পছন্দ করি. সরল, পরিষ্কার। সত্য কথা বলতে সংগ্রহগুলিও একটি টসস্ট্রিং পদ্ধতি প্রয়োজন, তবে এটি কাজ করে।
Tovi7

1
@ তোভি It এটি সম্ভবত কারণ নয় কারণ বেশিরভাগ OOTB সংগ্রহগুলি ইতিমধ্যে স্ট্রিং () র পাঠযোগ্য provide
সর্বাধিক ন্যানসি

@ বুশাকে স্ট্যাকটিকে স্ট্রিংয়ে রূপান্তর করতে ও (এন) সময় লাগে এবং স্ট্রিংটি কনসোলে মুদ্রণ করতে ও (এন) সময় লাগে
জ্যাচ ল্যাংলে

stack.toArray()খুব ব্যয়বহুল, সিপিইউ, সময় এবং স্মৃতি অনুসারে হতে পারে। একটি সমাধান যা আসল সংগ্রহ / পুনরাবৃত্তের উপরে পুনরাবৃত্তি হয় সম্ভবত কম সংস্থান খরচ হবে।
অ্যালিক্লিজিন-কিলাকা

52
String.join(",", yourIterable);

(জাভা 8)


12
আপনার আইট্রেবলটি আইটেবল হতে হবে <? CharSequence>
নাথন

3
String.join ( ",", yourCollection.stream () মানচিত্র (O -।> O.toString ()) সংগ্রহ (Collectors.toList ())।)
user1016765

@ ব্যবহারকারী 1016765 yourCollection.stream().map( o -> o.toString() ).collect( joining(",") ))আপনি বাম থেকে ডানে এটি পড়ার চেয়ে ভাল, আপনার মধ্যস্থ তালিকার সাথে কী করা হয় তা আপনার মস্তিষ্কে গণনা করার জন্য সামনের দিকে ফিরে তাকাতে হবে না
সিডিএলএক্সান্ডার

18

জাভা 8 টি স্ট্রিম এবং সংগ্রহকারী সহ এটি সহজেই করা যায়:

String format(Collection<?> c) {
  String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
  return String.format("[%s]", s);
}

প্রথম আমরা ব্যবহার mapসঙ্গে Object::toStringতৈরি করতে Collection<String>এবং তারপর সঙ্গে সংগ্রহে প্রতিটি আইটেম যোগদানের জন্য যোগদান সংগ্রাহক ব্যবহার ,বিভেদক হিসাবে।


22
উত্তরটি থেকে 'সহজে' শব্দটি সরিয়ে না দেওয়ার জন্য আমাকে পিছনে থাকতে হয়েছিল ;-) Collections.toString(stack)সহজ হবে।
FrVaBe

স্ট্রিং.ফর্ম্যাট () এ কল কেন? এটি কি কেবল বর্গাকার বন্ধনী পেতে?
জোলতা

18

অ্যাপাচি কমন্স প্রকল্পের প্রস্তাবিত মানচিত্রের ক্লাসটি এমন একটি MapUtils.debugPrintপদ্ধতি সরবরাহ করে যা আপনার মানচিত্রটি প্রিন্ট করবে।


আমি যে জানি না। আমি পেয়ারা লাইব্রেরির সাথে মারাত্মকভাবে পরিচিত নই তবে সেখানে থাকলে আমি অবাক হব না।
tlavarea

এটির জন্য কোনও প্রয়োজন নেই, অন্তত জাভা 6 এ, কারণ অ্যাবস্ট্রাকম্যাপ # টুস্ট্রিং এটি ইতিমধ্যে করেছে। মানচিত্র শুধুমাত্র প্রশ্ন: stackoverflow.com/questions/2828252/map-to-string-in-java
সিরো Santilli郝海东冠状病六四事件法轮功

12

System.out.println (সংগ্রহ গ) ইতিমধ্যে যে কোনও ধরণের সংগ্রহ পাঠযোগ্য ফর্ম্যাটে মুদ্রণ করেছে। কেবলমাত্র যদি সংগ্রহে ব্যবহারকারীর সংজ্ঞায়িত অবজেক্ট থাকে তবে কনটেন্ট প্রদর্শন করতে আপনাকে ব্যবহারকারী সংজ্ঞায়িত শ্রেণিতে toString () প্রয়োগ করতে হবে।


12

ক্লাসে টু স্ট্রিং () প্রয়োগ করুন।

এটিকে আরও সহজ করার জন্য আমি অ্যাপাচি কমন্স টু স্ট্রিংবিল্ডারকে সুপারিশ করছি । এটি দিয়ে, আপনাকে কেবল এই ধরণের পদ্ধতিটি লিখতে হবে:

public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}

এই ধরণের আউটপুট পেতে:

ব্যক্তি @ 7f54 [NAME = স্টিফেন, বয়স = 29]

একটি প্রতিফলিত বাস্তবায়নও আছে


ToStringBuilder সাধারণত মটরশুটি এবং তথ্য বহনকারী বস্তুর জন্য আরও বেশি প্রযোজ্য, জটিল ডেটা স্ট্রাকচারের জন্য কম। যদি স্ট্যাক অবজেক্টটি সমস্ত সঞ্চিত আইটেম মুদ্রণ না করে তবে এটি কোনও সাহায্য করবে না।
উরি

2
টোস্ট্রিংবিল্ডার, হ্যাশকোডবিল্ডার এবং ইক্যুয়ালসুবিল্ডারের প্রতিবিম্ব ব্যবহার অত্যন্ত অপ্রয়োজনীয়। আউটপুট ঠিকঠাক থাকলেও, এই ক্লাসগুলি সম্ভবত সপ্তাহের পারফরম্যান্স শিখর ...
জান হ্রুবি

2
প্রশ্নটি স্পষ্টতই বলেছে শ্রেণিটি একটি অন্তর্নির্মিত সংগ্রহ, সুতরাং টস্ট্রিং () সংশোধন করা যায় না।
রাসমুস কাজ


9

আমি toString()আপনার নিজের ক্লাসে ওভাররাইডিং সম্পর্কে (এবং যতটা সম্ভব প্রক্রিয়াটি স্বয়ংক্রিয় করার বিষয়ে) উপরের মন্তব্যগুলির সাথে একমত ।

যে ক্লাসগুলির জন্য আপনি সংজ্ঞায়িত করেননি , আপনি ToStringHelperপ্রতিটি লাইব্রেরি ক্লাসের জন্য নিজের পছন্দ অনুযায়ী পরিচালনা করতে চান এমন একটি ওভারলোড পদ্ধতি সহ একটি ক্লাস লিখতে পারেন:

public class ToStringHelper {
    //... instance configuration here (e.g. punctuation, etc.)
    public toString(List m) {
        // presentation of List content to your liking
    }
    public toString(Map m) {
        // presentation of Map content to your liking
    }
    public toString(Set m) {
        // presentation of Set content to your liking
    }
    //... etc.
}

সম্পাদনা: xukxpvfzflbbld এর মন্তব্যের জবাব, এখানে উল্লিখিত মামলাগুলির একটি সম্ভাব্য বাস্তবায়ন এখানে রয়েছে।

package com.so.demos;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class ToStringHelper {

    private String separator;
    private String arrow;

    public ToStringHelper(String separator, String arrow) {
        this.separator = separator;
        this.arrow = arrow;
    }

   public String toString(List<?> l) {
        StringBuilder sb = new StringBuilder("(");
        String sep = "";
        for (Object object : l) {
            sb.append(sep).append(object.toString());
            sep = separator;
        }
        return sb.append(")").toString();
    }

    public String toString(Map<?,?> m) {
        StringBuilder sb = new StringBuilder("[");
        String sep = "";
        for (Object object : m.keySet()) {
            sb.append(sep)
              .append(object.toString())
              .append(arrow)
              .append(m.get(object).toString());
            sep = separator;
        }
        return sb.append("]").toString();
    }

    public String toString(Set<?> s) {
        StringBuilder sb = new StringBuilder("{");
        String sep = "";
        for (Object object : s) {
            sb.append(sep).append(object.toString());
            sep = separator;
        }
        return sb.append("}").toString();
    }

}

এটি একটি পূর্ণ-বিকাশ বাস্তবায়ন নয়, তবে কেবল একটি স্টার্টার।


7

আপনি জাভা থেকে "অবজেক্টস" শ্রেণিটি ব্যবহার করতে পারেন (যা 1.7 থেকে পাওয়া যায়)

Collection<String> myCollection = Arrays.asList("1273","123","876","897");
Objects.toString(myCollection);

আউটপুট: 1273, 123, 876, 897

আর একটি সম্ভাবনা হ'ল গুগল গুভের "মোরঅবজেক্টস" শ্রেণিটি ব্যবহার করা , যা অনেকগুলি সহায়ক সহায়ক কার্যাদি সরবরাহ করে:

MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());

আউটপুট: নামআফ ইয়োরঅবজেক্ট = [1273, 123, 876, 897]

পেয়ারা ডক্স


1
Objects.toString()শুধু toString()সংগ্রহ কল । আপনার উদাহরণে, এটি কাজ করে কারণ সম্ভবত toString()অ্যারে-ব্যাকড সংগ্রহে খুব সুন্দরভাবে প্রিন্ট হয়।
গাইপ্যাডক

3

সঙ্গে এ্যাপাচি কমন্স 3 , আপনি কল করতে চান

StringUtils.join(myCollection, ",")

3

জাভা 8 এ

//will prints each element line by line
stack.forEach(System.out::println);

অথবা

//to print with commas
stack.forEach(
    (ele) -> {
        System.out.print(ele + ",");
    }
);

1

ব্যবহারকারীর সংজ্ঞায়িত অবজেক্ট সম্বলিত সংগ্রহ এমনকি মুদ্রণের জন্য পূর্ববর্তী উদাহরণটি সংশোধন করেছেন।

public class ToStringHelper {

    private  static String separator = "\n";

    public ToStringHelper(String seperator) {
        super();
        ToStringHelper.separator = seperator;

    }

    public  static String toString(List<?> l) {
        StringBuilder sb = new StringBuilder();
        String sep = "";
        for (Object object : l) {
            String v = ToStringBuilder.reflectionToString(object);
            int start = v.indexOf("[");
            int end = v.indexOf("]");
            String st =  v.substring(start,end+1);
            sb.append(sep).append(st);
            sep = separator;
        }
        return sb.toString();
    }

    public static String toString(Map<?,?> m) {
        StringBuilder sb = new StringBuilder();
        String sep = "";
        for (Object object : m.keySet()) {
            String v = ToStringBuilder.reflectionToString(m.get(object));
            int start = v.indexOf("[");
            int end = v.indexOf("]");
            String st =  v.substring(start,end+1);
            sb.append(sep).append(st);
            sep = separator;
        }
        return sb.toString();
    }

    public static String toString(Set<?> s) {
        StringBuilder sb = new StringBuilder();
        String sep = "";
        for (Object object : s) {
            String v = ToStringBuilder.reflectionToString(object);
            int start = v.indexOf("[");
            int end = v.indexOf("]");
            String st =  v.substring(start,end+1);
            sb.append(sep).append(st);
            sep = separator;
        }
        return sb.toString();
    }

    public static void print(List<?> l) {
        System.out.println(toString(l));    
    }
    public static void print(Map<?,?> m) {
        System.out.println(toString(m));    
    }
    public static void print(Set<?> s) {
        System.out.println(toString(s));    
    }

}

1

toString()এই দিনগুলিতে বেশিরভাগ সংগ্রহের জাভাতে দরকারী (জাভা 7/8)। সুতরাং আপনার যা প্রয়োজন তা বোঝাতে স্ট্রিম অপারেশন করার দরকার নেই, কেবল toStringসংগ্রহে আপনার মান শ্রেণিকে ওভাররাইড করুন এবং আপনার যা প্রয়োজন তা পেয়ে যান।

অ্যাবস্ট্রাকম্যাপ এবং অ্যাবস্ট্রাক্ট কালেকশন উভয়ই উপাদান প্রতি স্ট্রিং কল করে স্ট্রিং () প্রয়োগ করে।

নীচে আচরণ দেখানোর জন্য একটি টেস্টক্লাস দেওয়া আছে।

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class ToString {
  static class Foo {
    int i;
    public Foo(int i) { this.i=i; }
    @Override
    public String toString() {
        return "{ i: " + i + " }";
    }
  }
  public static void main(String[] args) {
    List<Foo> foo = new ArrayList<>();
    foo.add(new Foo(10));
    foo.add(new Foo(12));
    foo.add(new Foo(13));
    foo.add(new Foo(14));
    System.out.println(foo.toString());
    // prints: [{ i: 10 }, { i: 12 }, { i: 13 }, { i: 14 }]

    Map<Integer, Foo> foo2 = new HashMap<>();
    foo2.put(10, new Foo(10));
    foo2.put(12, new Foo(12));
    foo2.put(13, new Foo(13));
    foo2.put(14, new Foo(14));
    System.out.println(foo2.toString());
    // prints: {10={ i: 10 }, 12={ i: 12 }, 13={ i: 13 }, 14={ i: 14 }}
  }
}

1

তাদেরকে JSON

একটি বিকল্প সমাধান আপনার সংগ্রহকে JSON ফর্ম্যাটে রূপান্তর করতে পারে এবং জসন-স্ট্রিং মুদ্রণ করতে পারে। সুবিধাটি কার্যকরভাবে প্রয়োগ না করে একটি ভাল ফর্ম্যাট এবং পঠনযোগ্য অবজেক্ট-স্ট্রিং toString()

গুগলের জিসন ব্যবহারের উদাহরণ :

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

...

    printJsonString(stack);

...
public static void printJsonString(Object o) {
    GsonBuilder gsonBuilder = new GsonBuilder();
    /*
     * Some options for GsonBuilder like setting dateformat or pretty printing
     */
    Gson gson = gsonBuilder.create();
    String json= gson.toJson(o);
    System.out.println(json);
}

0

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


এবং কীভাবে এই ক্লাসগুলি ডাব্লু / হার্ড-ওয়্যার্ড ফর্ম্যাট করে গ্রহনটি ফর্ম্যাট করে? এটাই আমি খুঁজছি
এলাজার লাইবোভিচ

0

সপ অন কালেকশন করার সময় সাবধান হন, এটি ConcurrentModificationব্যতিক্রম ছুঁড়ে ফেলতে পারে । কারণ toStringপ্রতিটি সংগ্রহের অভ্যন্তরীণ পদ্ধতি অভ্যন্তরীণভাবে সংগ্রহের মাধ্যমে কল Iteratorকরে।


0

ব্যতীত অন্য যে কোনও সংগ্রহের জন্য কাজ করা উচিত Map, তবে এটি সমর্থন করাও সহজ। প্রয়োজনে এই 3 টি অক্ষরকে আর্গুমেন্ট হিসাবে পাস করার জন্য কোডটি সংশোধন করুন।

static <T> String seqToString(Iterable<T> items) {
    StringBuilder sb = new StringBuilder();
    sb.append('[');
    boolean needSeparator = false;
    for (T x : items) {
        if (needSeparator)
            sb.append(' ');
        sb.append(x.toString());
        needSeparator = true;
    }
    sb.append(']');
    return sb.toString();
}

0

আপনি ব্যবহার করার চেষ্টা করতে পারেন

org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);

0

আপনার কাজটি সহজ করার জন্য দুটি উপায় রয়েছে। 1. আমদানি করুন গসন লাইব্রেরি। 2. লম্বোক ব্যবহার করুন।

উভয়ই আপনাকে বস্তুর উদাহরণ থেকে স্ট্রিং তৈরি করতে সহায়তা করে। গসন আপনার বস্তুকে বিশ্লেষণ করবে, লম্বোক আপনার শ্রেণীর অবজেক্ট টু স্ট্রিং পদ্ধতিতে ওভাররাইড করবে।

আমি গসন সুন্দর মুদ্রণ সম্পর্কে একটি উদাহরণ রেখেছি, আমি অবজেক্ট এবং বিষয়বস্তু সংগ্রহের জন্য সহায়ক শ্রেণি তৈরি করি। আপনি যদি লম্বোক ব্যবহার করেন তবে আপনি আপনার শ্রেণিকে @ টোস্ট্রিং হিসাবে চিহ্নিত করতে পারেন এবং সরাসরি আপনার অবজেক্টটি মুদ্রণ করতে পারেন।

@Scope(value = "prototype")
@Component
public class DebugPrint<T> {
   public String PrettyPrint(T obj){
      Gson gson = new GsonBuilder().setPrettyPrinting().create();
      return gson.toJson(obj);
   }
   public String PrettyPrint(Collection<T> list){
      Gson gson = new GsonBuilder().setPrettyPrinting().create();
      return list.stream().map(gson::toJson).collect(Collectors.joining(","));
   }

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.