জাভাতে কোনও তালিকার সমস্ত উপাদান কীভাবে মুদ্রণ করবেন?


236

আমি এ এর ​​সমস্ত উপাদান মুদ্রণ করার চেষ্টা করছি List, তবে এটি Objectমানটির চেয়ে পয়েন্টারটি মুদ্রণ করছে ।

এটি আমার মুদ্রণ কোড ...

for(int i=0;i<list.size();i++){
    System.out.println(list.get(i));
} 

কেউ দয়া করে আমাকে সহায়তা করতে পারে কেন এটি উপাদানগুলির মানটি মুদ্রণ করে না।


3
আপনি কোন ধরণের Listহতে ঘোষণা করেছেন ? আপনি কীভাবে এটি ঘোষণা এবং তাত্ক্ষণিক করেছিলেন তা আমাদের দেখান।
মাকোটো

আপনাকে টুস্ট্রিংকে কল করতে হবে এবং আপনি ক্লাসের ব্যাখ্যা পাবেন বা তালিকার যে ধরণের তালিকার জন্য রয়েছে তা
স্ট্রিং

আপনি এটিকে মুদ্রণের জন্য বলছেন - আপনার আলাদা একটি স্ট্রিং বা অন্যান্য পঠনযোগ্য স্ট্রিং দরকার।
ডেভ নিউটন

অ্যারেলিস্ট <ক্লাশ> তালিকা = নতুন অ্যারেলিস্ট <ক্লাস> ();
ব্যবহারকারী 1335361

4
মনে রাখবেন যে আরো কম্প্যাক্ট সিনট্যাক্স আপনি একই জিনিস সম্পন্ন করার জন্য ব্যবহার করতে পারেন যে: for (Object obj : list) {System.out.println(obj);}
অ্যারোথ

উত্তর:


114

তালিকার উপাদানটি প্রিন্ট আউট সম্পর্কে এখানে কিছু উদাহরণ রয়েছে:

public class ListExample {

    public static void main(String[] args) {
        List<Model> models = new ArrayList<>();

        // TODO: First create your model and add to models ArrayList, to prevent NullPointerException for trying this example

        // Print the name from the list....
        for(Model model : models) {
            System.out.println(model.getName());
        }

        // Or like this...
        for(int i = 0; i < models.size(); i++) {
            System.out.println(models.get(i).getName());
        }
    }
}

class Model {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

1
Modelশ্রেণীর ভূমিকা কীভাবে প্রশ্নের সাথে সম্পর্কিত?
কার্ল রিখটার

4
এটি কেবল একটি অনুমান, যেহেতু আমি জানি না তালিকার ভিতরে কী ধরণের অবজেক্ট।
ক্রেজনেজ

477

নিম্নলিখিতটি কমপ্যাক্ট এবং আপনার উদাহরণ কোডের লুপটি এড়িয়ে চলেছে (এবং আপনাকে দুর্দান্ত কমা দেয়):

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

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


18
শুধু কি সম্পর্কে list.toString()
জেসকি

22
কেবলমাত্র 'list.toString ()' ব্যবহার করে স্বতন্ত্র উপাদানগুলি মুদ্রণ করা যায় না, যদি না এটি তালিকা ইন্টারফেসের একটি কাস্টম বাস্তবায়ন হয় যা সাধারণ আচরণকে (শ্রেণীর নাম এবং একটি হ্যাশ কোড মুদ্রণের জন্য, কম বেশি) প্রচ্ছন্ন করে।
হালি কামিন্স

1
যদি তারা কাস্টম ক্লাস ব্যবহার করে এবং ওভাররাইড না করে toString, আপনার সমাধানটি এর শ্রেণীর নাম এবং হ্যাশ কোডও মুদ্রণ করবে।
জেসকি

এটি [মান 1, মান 2, মান 3] হিসাবে মুদ্রণ করে। আমরা কি [] ছাড়া প্রিন্ট করতে পারি?
কানাগুলি

আসলে, @ জাসকি ঠিক - তাদের উত্তরটি আরও ভাল। Arraysপদ্ধতি অ্যারে জন্য সহায়ক, কিন্তু এখন এর উপশ্রেণী জন্য প্রয়োজনীয় নয় AbstractCollection
হলি কামিন্স

100

জাভা 8-এর পরে, তালিকাটি একটি "ডিফল্ট" পদ্ধতির উত্তরাধিকার সূত্রে প্রাপ্ত যা আপনি পদ্ধতি রেফারেন্স "সিস্টেম.আউট :: প্রিন্টলন" এর সাথে একত্রিত করতে পারেন:

list.forEach(System.out::println);

2
@ কাটজা হান, printlnআউটপুটটিতে কিছু স্ট্রিং যুক্ত বা প্রিপেন্ড করা কি সম্ভব ?
gumkins

2
@ গুমকিনস, হ্যাঁ, আপনি পারেন। উদাহরণ: অ্যারেস স্ট্রিম (নতুন স্ট্রিং [] John "জন", "সানসা", "সের্সি"}) map ;
টিয়াগো মুসি

40
System.out.println(list);//toString() is easy and good enough for debugging.

toString()এর AbstractCollection পরিষ্কার এবং এটি করতে যথেষ্ট সহজ হবেAbstractListএটি একটি সাবক্লাস AbstractCollection, সুতরাং লুপের প্রয়োজন নেই এবং টো আরের () দরকার নেই।

এই সংগ্রহের একটি স্ট্রিং উপস্থাপনা ফেরত দেয়। স্ট্রিং উপস্থাপনায় সংগ্রহের উপাদানগুলির একটি তালিকা রয়েছে যা এর পুনরুক্তকারী দ্বারা বর্গাকার বন্ধনী ("[]") দ্বারা আবদ্ধ করা হয় order সংলগ্ন উপাদানগুলি "," (কমা এবং স্পেস) অক্ষর দ্বারা পৃথক করা হয়। উপাদানগুলি স্ট্রিং.ভেলুওফ (অবজেক্ট) দ্বারা স্ট্রিংগুলিতে রূপান্তরিত হয়।

আপনি যদি নিজের তালিকায় কোনও কাস্টম অবজেক্ট ব্যবহার করছেন তবে শিক্ষার্থী বলুন, toString()অর্থবোধক আউটপুট পাওয়ার জন্য আপনাকে তার পদ্ধতিটি ওভাররাইড করতে হবে (এই পদ্ধতিটি ওভাররাইড করা সর্বদা ভাল)

নীচের উদাহরণটি দেখুন:

public class TestPrintElements {

    public static void main(String[] args) {

        //Element is String, Integer,or other primitive type
        List<String> sList = new ArrayList<String>();
        sList.add("string1");
        sList.add("string2");
        System.out.println(sList);

        //Element is custom type
        Student st1=new Student(15,"Tom");
        Student st2=new Student(16,"Kate");
        List<Student> stList=new ArrayList<Student>();
        stList.add(st1);
        stList.add(st2);
        System.out.println(stList);
   }
}


public  class Student{
    private int age;
    private String name;

    public Student(int age, String name){
        this.age=age;
        this.name=name;
    }

    @Override
    public String toString(){
        return "student "+name+", age:" +age;
    }
}

আউটপুট:

[string1, string2]
[student Tom age:15, student Kate age:16]

কারণ এই উত্তরটি সম্পূর্ণ সঠিক নয়। এটি উপলব্ধি না করে পলিমারফিজম ব্যবহার করছে। এখানে জন্য প্রকৃত উত্তরাধিকার অনুক্রমের এর list: List -> Collection -> Iterable -> Object। অ্যাবস্ট্রাক্ট কালেকশন থেকে প্রকৃতপক্ষে যে বর্গটি উত্তরাধিকার সূত্রে প্রাপ্ত তা হ'ল ArrayList। তাই এই উদাহরণে যখন toString()বলা হয় এটা খুঁজে বের করে ArrayListবাস্তবায়নের যা সংজ্ঞায়িত করা হয় AbstractCollection। উত্তরাধিকারের শ্রেণিবিন্যাসের জন্য নোট করুন ArrayList:ArrayList -> AbstractList -> AbstractCollection -> Collection -> Iterable -> Object
anon58192932

20

জাভা 8 স্ট্রিমের পদ্ধতির ...

list.stream().forEach(System.out::println);

কাটজা হাহ্নের সমান উত্তর
কার্ল রিখটার

না এটা না। আমার লিভারেজ স্ট্রিম ()।
ব্র্যাডলি ডি

@ ব্র্যাডলি সেখানে পদ্ধতি কলগুলির আরও একটি স্তর যুক্ত করে কী লাভগুলি উপলব্ধি করা যায়?
লিওন

15

তালিকার অবজেক্টগুলি অবশ্যই toStringতাদের স্ক্রিনে অর্থপূর্ণ কিছু মুদ্রণের জন্য প্রয়োগ করেছে।

পার্থক্যগুলি দেখার জন্য এখানে একটি দ্রুত পরীক্ষা করা হয়েছে:

public class Test {

    public class T1 {
        public Integer x;
    }

    public class T2 {
        public Integer x;

        @Override
        public String toString() {
            return x.toString();
        }
    }

    public void run() {
        T1 t1 = new T1();
        t1.x = 5;
        System.out.println(t1);

        T2 t2 = new T2();
        t2.x = 5;
        System.out.println(t2);

    }

    public static void main(String[] args) {        
        new Test().run();
    }
}

এবং যখন এটি কার্যকর করা হয়, তখন স্ক্রিনে মুদ্রিত ফলাফলগুলি হ'ল:

t1 = Test$T1@19821f
t2 = 5

যেহেতু টি 1 টসস্ট্রিং পদ্ধতিটিকে ওভাররাইড করে না, এর উদাহরণ টি 1 এমন কিছু হিসাবে প্রিন্ট করে যা খুব কার্যকর নয়। অন্যদিকে, টি 2 স্ট্রিংকে ওভাররাইড করে, তাই এটি I / O তে ব্যবহৃত হওয়ার সময় আমরা এটি কী প্রিন্ট করে তা নিয়ন্ত্রণ করি এবং আমরা স্ক্রিনে কিছুটা আরও ভাল দেখতে পাই।


11

জাভা 8 কনস্ট্রাক্টস List<String> stringListব্যবহার করে যা বিভিন্ন উপায়ে মুদ্রণ করা যায় তা বিবেচনা করুন :

stringList.forEach(System.out::println);                            // 1) Iterable.forEach
stringList.stream().forEach(System.out::println);                   // 2) Stream.forEach (order maintained generally but doc does not guarantee)
stringList.stream().forEachOrdered(System.out::println);            // 3) Stream.forEachOrdered (order maintained always)
stringList.parallelStream().forEach(System.out::println);           // 4) Parallel version of Stream.forEach (order not maintained)
stringList.parallelStream().forEachOrdered(System.out::println);    // 5) Parallel version ofStream.forEachOrdered (order maintained always)

এই পদ্ধতিগুলি একে অপরের থেকে আলাদা কীভাবে?

প্রথম পদ্ধতির ( Iterable.forEach) - সংগ্রহের পুনরুক্তিটি সাধারণত ব্যবহৃত হয় এবং এটি ব্যর্থ-দ্রুত ডিজাইন করা হয়েছে যার অর্থ ConcurrentModificationExceptionঅন্তর্নিহিত সংগ্রহটি পুনরাবৃত্তির সময় কাঠামোগতভাবে সংশোধন করা হলে এটি নিক্ষেপ করবে । হিসাবে উল্লেখ করেছে ডক জন্য ArrayList:

কাঠামোগত পরিবর্তন হ'ল এমন কোনও ক্রিয়াকলাপ যা এক বা একাধিক উপাদান যুক্ত করে বা মুছে ফেলে বা স্পষ্টভাবে ব্যাকিং অ্যারেটিকে আকার দেয়; নিছক কোনও উপাদানের মান নির্ধারণ কোনও কাঠামোগত পরিবর্তন নয়।

সুতরাং এটির ArrayList.forEachমান নির্ধারণের জন্য কোনও সমস্যা ছাড়াই অনুমোদিত। এবং সমকালীন সংগ্রহের ক্ষেত্রে যেমন ConcurrentLinkedQueueপুনরুক্তিটি দুর্বল-সামঞ্জস্যপূর্ণ হবে যার অর্থ পাস হওয়া ক্রিয়াকলাপগুলি ব্যতিক্রম forEachছাড়াই কাঠামোগত পরিবর্তন আনতে অনুমোদিত ConcurrentModificationException। তবে এখানে পরিবর্তনগুলি সেই পুনরাবৃত্তিতে প্রদর্শিত হতে পারে বা নাও হতে পারে।

দ্বিতীয় পদ্ধতির ( Stream.forEach) - অর্ডার অপরিজ্ঞাত। যদিও এটি অনুক্রমিক স্ট্রিমগুলির জন্য না ঘটে তবে স্পেসিফিকেশন এটির গ্যারান্টি দেয় না। এছাড়াও পদক্ষেপটি প্রকৃতির হস্তক্ষেপ না করা প্রয়োজন। ডক হিসাবে উল্লিখিত :

এই অপারেশনের আচরণটি স্পষ্টতই নিরপেক্ষবাদী। সমান্তরাল স্ট্রিম পাইপলাইনগুলির জন্য, এই অপারেশনটি স্ট্রিমের এনকাউন্টার অর্ডারকে সম্মান করার গ্যারান্টি দেয় না কারণ এটি করা সমান্তরালতার সুবিধাটিকে ত্যাগ করবে।

তৃতীয় পদ্ধতির ( Stream.forEachOrdered) - ক্রিয়াটি স্ট্রিমের এনকাউন্টার ক্রমে সম্পাদিত হবে। সুতরাং যখনই অর্ডার বিষয়গুলি forEachOrderedদ্বিতীয় চিন্তা ছাড়াই ব্যবহার করুন । ডক হিসাবে উল্লিখিত :

এই স্ট্রিমের প্রতিটি উপাদানটির জন্য একটি ক্রিয়া সম্পাদন করে, স্ট্রিমটির এনকাউন্টার ক্রমে স্ট্রিমের যদি সংজ্ঞায়িত এনক্রোয়ার অর্ডার থাকে।

একটি উপর iterating যদিও সিঙ্ক্রোনাইজ সংগ্রহে প্রথম পদ্ধতির সংগ্রহ লক লাগবে একবার এবং কলের কর্ম পদ্ধতি, কিন্তু প্রবাহের ক্ষেত্রে তারা সংগ্রহ এর spliterator, যা লক করে না এবং অ এর বর্তমানে প্রতিষ্ঠিত নিয়ম উপর নির্ভর ব্যবহার সব জুড়ে এটি রাখা হবে -interference। সংগ্রহের ব্যাকিংয়ের ক্ষেত্রে স্ট্রিমটি পুনরাবৃত্তির সময় সংশোধন করা হয় একটি ConcurrentModificationExceptionনিক্ষিপ্ত হবে বা বেমানান ফলাফল হতে পারে।

চতুর্থ পন্থা (সমান্তরাল Stream.forEach) - যেমন ইতিমধ্যে সমান্তরাল স্ট্রিমের ক্ষেত্রে প্রত্যাশা অনুযায়ী এনকাউন্টার অর্ডারকে সম্মান করার কোনও গ্যারান্টি নেই। এটি সম্ভব যে ক্রিয়াকলাপটি বিভিন্ন থ্রেডে বিভিন্ন উপাদানের জন্য করা হয় যা কখনই হতে পারে না forEachOrdered

পঞ্চম অভিগমন (সমান্তরাল Stream.forEachOrdered) -forEachOrdered উৎস আসলে নির্বিশেষে দ্বারা নির্দিষ্ট অনুক্রমে উপাদানের প্রক্রিয়া হবে কিনা প্রবাহ অনুক্রমিক অথবা সমান্তরাল হয়। সুতরাং এটি সমান্তরাল স্ট্রিমগুলির সাথে ব্যবহার করার কোনও অর্থ নেই।




7

আমিও একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমার কোড:

List<Integer> leaveDatesList = new ArrayList<>();

.....inserted value in list.......

ওয়ে 1: লুপের জন্য একটি তালিকা মুদ্রণ করা

for(int i=0;i<leaveDatesList.size();i++){
    System.out.println(leaveDatesList.get(i));
}

উপায় 2: লুপের জন্য, প্রতিটি ফোনে তালিকাটি মুদ্রণ করা

for(Integer leave : leaveDatesList){
    System.out.println(leave);
}

উপায় 3: জাভা 8 তালিকা মুদ্রণ

leaveDatesList.forEach(System.out::println);

5
  1. তালিকায় কোন ধরণের উপাদান রয়েছে তা আপনি নির্দিষ্ট করেন নি, যদি এটি কোনও প্রাথমিক তথ্য প্রকারের হয় তবে আপনি উপাদানগুলি মুদ্রণ করতে পারেন।
  2. তবে যদি উপাদানগুলি বস্তু হয় তবে ক্ষিতিজ মেহতা উল্লিখিত হিসাবে আপনাকে সেই বস্তুর মধ্যে "টু স্ট্রিং" পদ্ধতিটি প্রয়োগ করতে হবে (ওভাররাইড) করতে হবে - যদি এটি ইতিমধ্যে বাস্তবায়ন না করা হয় - এবং এটিকে বস্তুর মধ্যে থেকে কিছু পূর্ণ অর্থ ফেরত দেওয়া যাক, উদাহরণস্বরূপ:

    class Person {
        private String firstName;
        private String lastName;
    
        @Override
        public String toString() {
            return this.firstName + " " + this.lastName;
        }
    }

3

System.out.println(list); আমার জন্য কাজ কর.

এখানে একটি সম্পূর্ণ উদাহরণ:

import java.util.List;    
import java.util.ArrayList;

public class HelloWorld {
     public static void main(String[] args) {
        final List<String> list = new ArrayList<>();
        list.add("Hello");
        list.add("World");
        System.out.println(list);
     }
}

এটি মুদ্রণ করবে [Hello, World]


পূর্বের উত্তরগুলি থেকে আলাদা নয়
কার্ল রিখটার

আমি আমদানি, শ্রেণি এবং প্রধান পদ্ধতি যা আপনার অনুলিপি এবং পেস্ট করতে পারেন এবং ফলাফলটি দেখিয়েছে তার সাথে একটি পূর্ণ উদাহরণ দিয়েছি। অতএব, আমার মতে এটিকে ভোট দেওয়ার কোনও কারণ নেই
jfmg


2

আমি একটি ডাম্প ফাংশন লিখেছি, যা কোনও বস্তুর সর্বজনীন সদস্যদের মুদ্রণ করে যদি এটি স্ট্রিং () এর উপরে ওভাররাইড না করে থাকে। যেকোন এটি সহজেই কলকারীদের কল করতে প্রসারিত করতে পারে। Javadoc:

নিম্নলিখিত নিয়মগুলি ব্যবহার করে System.out এ প্রদত্ত অবজেক্টটি ফেলে দেয়:

  • যদি বস্তুটি পরিলক্ষিত হয় তবে এর সমস্ত উপাদান ডাম্প হয়।
  • যদি অবজেক্ট বা এর একটির সুপারক্লাসগুলি স্ট্রিং () এ ওভাররাইড করে তবে "টু স্ট্রিং" ফেলে দেওয়া হয়
  • অন্য পদ্ধতিটি অবজেক্টের সমস্ত পাবলিক সদস্যদের জন্য পুনরাবৃত্তভাবে বলা হয়

/**
 * Dumps an given Object to System.out, using the following rules:<br>
 * <ul>
 * <li> If the Object is {@link Iterable}, all of its components are dumped.</li>
 * <li> If the Object or one of its superclasses overrides {@link #toString()}, the "toString" is dumped</li>
 * <li> Else the method is called recursively for all public members of the Object </li>
 * </ul>
 * @param input
 * @throws Exception
 */
public static void dump(Object input) throws Exception{
    dump(input, 0);
}

private static void dump(Object input, int depth) throws Exception{
    if(input==null){
        System.out.print("null\n"+indent(depth));
        return;
    }

    Class<? extends Object> clazz = input.getClass();
    System.out.print(clazz.getSimpleName()+" ");
    if(input instanceof Iterable<?>){
        for(Object o: ((Iterable<?>)input)){
            System.out.print("\n"+indent(depth+1));
            dump(o, depth+1);
        }
    }else if(clazz.getMethod("toString").getDeclaringClass().equals(Object.class)){
        Field[] fields = clazz.getFields();
        if(fields.length == 0){
            System.out.print(input+"\n"+indent(depth));
        }
        System.out.print("\n"+indent(depth+1));
        for(Field field: fields){
            Object o = field.get(input);
            String s = "|- "+field.getName()+": ";
            System.out.print(s);
            dump(o, depth+1);
        }
    }else{

        System.out.print(input+"\n"+indent(depth));
    }
}

private static String indent(int depth) {
    StringBuilder sb = new StringBuilder();
    for(int i=0; i<depth; i++)
        sb.append("  ");
    return sb.toString();
}

2

একটি তালিকার বিষয়বস্তু মুদ্রণের জন্য লুপের জন্য:

List<String> myList = new ArrayList<String>();
myList.add("AA");
myList.add("BB");

for ( String elem : myList ) {
  System.out.println("Element : "+elem);
}

ফলাফল :

Element : AA
Element : BB

আপনি যদি একটি একক লাইনে মুদ্রণ করতে চান (কেবল তথ্যের জন্য):

String strList = String.join(", ", myList);
System.out.println("Elements : "+strList);

ফলাফল :

Elements : AA, BB


1

আমি এখন এটি নিয়ে কাজ করতে হবে ...

List<Integer> a = Arrays.asList(1, 2, 3);
List<Integer> b = Arrays.asList(3, 4);
List<int[]> pairs = a.stream()
  .flatMap(x -> b.stream().map(y -> new int[]{x, y}))
  .collect(Collectors.toList());

Consumer<int[]> pretty = xs -> System.out.printf("\n(%d,%d)", xs[0], xs[1]);
pairs.forEach(pretty);

1

এটি কোন ধরণের অবজেক্টগুলিতে সঞ্চিত Listরয়েছে এবং এর toString()পদ্ধতির প্রয়োগ রয়েছে কিনা তার উপর নির্ভর করে । System.out.println(list)সব মান জাভা বস্তুর প্রকার (প্রিন্ট করা উচিত String, Long, Integerইত্যাদি)। যদি আমরা কাস্টম অবজেক্টের ধরণের ব্যবহার করে থাকি তবে override toString()আমাদের কাস্টম অবজেক্টের পদ্ধতিটি দরকার ।

উদাহরণ:

class Employee {
 private String name;
 private long id;

 @Override
 public String toString() {
   return "name: " + this.name() + 
           ", id: " + this.id();
 }  
}

টেস্ট:

class TestPrintList {
   public static void main(String[] args) {
     Employee employee1 =new Employee("test1", 123);
     Employee employee2 =new Employee("test2", 453);
     List<Employee> employees = new ArrayList(2);
     employee.add(employee1);
     employee.add(employee2);
     System.out.println(employees);
   }
}


0

আপনি চান যে উপাদানটি প্রিনট্যান্ড হবে তাই টুস্ট্রিং () পদ্ধতিটিকে ওভাররাইড করার চেষ্টা করুন। সুতরাং মুদ্রণের পদ্ধতিটি এটি হতে পারে:

for(int i=0;i<list.size();i++){
    System.out.println(list.get(i).toString());
} 

ওপির কোড এটিই করে। কলটি অন্তর্ভুক্ত toString
কার্ল রিখটার

-2
   List<String> textList=  messageList.stream()
                            .map(Message::getText)
                            .collect(Collectors.toList());

        textList.stream().forEach(System.out::println);
        public class Message  {

        String name;
        String text;

        public Message(String name, String text) {
            this.name = name;
            this.text = text;
        }

        public String getName() {
            return name;
        }

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