টু স্ট্রিং () পদ্ধতি থেকে প্রাপ্ত স্ট্রিংয়ে অবজেক্টের একটি তালিকা রূপান্তর করতে জাভা 8 ব্যবহার করে


206

জাভা ৮-তে প্রচুর দরকারী নতুন জিনিস রয়েছে Eg উদাহরণস্বরূপ, আমি বস্তুর তালিকার উপরে একটি স্ট্রিম দিয়ে পুনরাবৃত্তি করতে পারি এবং তারপরে Objectউদাহরণগুলির একটি নির্দিষ্ট ক্ষেত্র থেকে মানগুলি যোগ করতে পারি । যেমন

public class AClass {
  private int value;
  public int getValue() { return value; }
}

Integer sum = list.stream().mapToInt(AClass::getValue).sum();

সুতরাং, আমি জিজ্ঞাসা করছি যদি এমন কোনও নির্মাণের কোনও উপায় আছে Stringযা toString()পদ্ধতির আউটপুটকে একক লাইনে উদাহরণ দিয়ে দেখায়।

List<Integer> list = ...

String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class

ধরুন যে listপূর্ণসংখ্যার রয়েছে 1, 2এবং 3, আমি আশা করি, concatenatedহয় "123"বা "1,2,3"


উত্তর:


368

একটি সহজ উপায় হ'ল আপনার তালিকা আইটেমগুলিতে যুক্ত করা StringBuilder

   List<Integer> list = new ArrayList<>();
   list.add(1);
   list.add(2);
   list.add(3);

   StringBuilder b = new StringBuilder();
   list.forEach(b::append);

   System.out.println(b);

আপনি চেষ্টা করতে পারেন:

String s = list.stream().map(e -> e.toString()).reduce("", String::concat);

ব্যাখ্যা: মানচিত্রটি পূর্ণসংখ্যার স্ট্রিমটিকে স্ট্রিং স্ট্রিমে রূপান্তর করে, তারপরে এটি সমস্ত উপাদানগুলির সংমিশ্রণ হিসাবে হ্রাস পেয়েছে।

দ্রষ্টব্য: এটি normal reductionযা ও (এন 2 ) এ সম্পাদন করে

ভাল পারফরম্যান্সের জন্য এফ। বুলারের উত্তরের সাথে এক StringBuilderবা mutable reductionঅনুরূপ ব্যবহার করুন ।

String s = list.stream().map(Object::toString).collect(Collectors.joining(","));

রেফ: স্ট্রিম হ্রাস


2
হ্যাঁ, কোনও ইনলাইন সমাধান নয়, একটি সমাধান।
মাদুরপুত্র

পেল না। আপনি কি আশা করছেন?
শাইল016

2
আমি বুঝতে পারি না কেন "O (n2) এ সঞ্চালিত স্বাভাবিক হ্রাস"। আমার কাছে এটি ও (এন) এর মতো আরও "দেখাচ্ছে" ...
ডাটাহাকি

2
@ দাতাহাকি আমি জাভা লোক নই, তবে আমি অনুমান করতে পারি যে পুনরাবৃত্ত স্ট্রিং কনটেনটেশন (হ্রাস) এর জন্য প্রতিটি পুনরাবৃত্তিতে অ্যারে (পুনরায়) বরাদ্দ প্রয়োজন, যা এটি ও (এন ^ 2) করে তোলে। joinঅন্যদিকে চূড়ান্ত স্ট্রিংটি পপুলেশন করার আগে এটিকে বড় পরিমাণে সংরক্ষণ করার জন্য যথেষ্ট পরিমাণে একটি একক অ্যারে প্রাকপলোকট করবে O (এন)।
এলি করভিগো

2
খুব ভাল টিপ। সম্ভবত আপনি "::" স্বরলিপি ব্যবহার করে সরল করতে পারেন। তাই list.stream().map(Object::toString).reduce("", String::concat),। ব্যবহার map e-> e.toString()করা কিছুটা নিরর্থক।
e2a

194

এপিআইতে একজন সংগ্রাহক রয়েছেন joining। এটি একটি স্থিতিশীল পদ্ধতি Collectors

list.stream().map(Object::toString).collect(Collectors.joining(","))

প্রয়োজনীয় কলের কারণে নিখুঁত নয় toString, তবে কাজ করে। বিভিন্ন সীমানার সম্ভব।


7
সম্পূর্ণতার জন্য: কাজ করতে সেই সঠিক কোডটি পেতে, আপনাকে দরকারimport static java.util.stream.Collectors.joining;
মাহদি

7
কেন আমাদের ম্যাপিং এবং স্পষ্ট `টু স্ট্রিং 'দরকার? যদি সংগ্রাহক স্ট্রিং উপাদানগুলির প্রত্যাশা করে তবে রূপান্তরটি অন্তর্নিহিতভাবে আহ্বান করা উচিত, না ?!
বাসেল শিশানী

10

জাভা 8 ছাড়া যে কেউ এটি করার চেষ্টা করছে সে ক্ষেত্রে খুব সুন্দর কৌশল আছে। List.toString () ইতিমধ্যে এমন দেখতে সংগ্রহ সংগ্রহ করে:

[1,2,3]

আপনার নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে এটি যতক্ষণ আপনার তালিকার আইটেমগুলিতে না থাকে ততক্ষণ পোস্ট-প্রসেস করা যায় [] বা,।

এই ক্ষেত্রে:

list.toString().replace("[","").replace("]","") 

অথবা যদি আপনার ডেটাগুলিতে বর্গাকার বন্ধনী থাকতে পারে:

String s=list.toString();
s = s.substring(1,s.length()-1) 

আপনি একটি সুন্দর যুক্তিসঙ্গত আউটপুট পাবেন।

প্রতিটি লাইনে একটি অ্যারে আইটেম এইভাবে তৈরি করা যেতে পারে:

list.toString().replace("[","").replace("]","").replaceAll(",","\r\n")

আমি এই কৌশলটি এই জাতীয় কিছু ব্যবহার করে একটি ছোট অ্যাপের একটি তালিকা থেকে এইচটিএমএল টুলটিপগুলি তৈরি করতে ব্যবহার করেছি:

list.toString().replace("[","<html>").replace("]","</html>").replaceAll(",","<br>")

আপনার যদি অ্যারে থাকে তবে এর পরিবর্তে অ্যারে.এএসলিস্ট (তালিকা) .toString () দিয়ে শুরু করুন

আমি এই সত্যটি সম্পূর্ণরূপে মালিক করব যে এটি সর্বোত্তম নয়, তবে এটি আপনি যতটা ভাবেন ঠিক ততটা অক্ষম নয় এবং পড়তে এবং বুঝতে খুব সোজা। এটি অবশ্য বেশ জটিল ible বিশেষত আপনার ডেটাতে কমা থাকতে পারে এবং আপনার ডেটাতে বর্গক্ষেত্র বন্ধনী থাকলে স্ট্রিং সংস্করণটি ব্যবহার করা যেতে পারে তবে বিশেষত প্রতিস্থাপনের সাথে উপাদানগুলিকে আলাদা করার চেষ্টা করবেন না, তবে সংখ্যার অ্যারেটির জন্য এটি বেশ অনেক বেশি নিখুঁত।


যদিও এটি সাধারণত কাজ করবে, এর নিশ্চয়তা নেই - Listএর কাঠামো কার্যকর করে না toString()AbstractCollectionতবে, এই কাঠামোটি ডিফল্টরূপে ব্যবহার করে এবং আমি মনে করি Listজাভা এসই-তে সমস্ত সাধারণ উদ্দেশ্য বাস্তবায়নও এটি করে। উদাহরণস্বরূপ, org.springframework.util.AutoPopulatingListযা বসন্তে বাস্তবায়ন করে না toString()এবং উদাহরণস্বরূপ ফিরে আসে " org.springframework.util.AutoPopulatingList@170a1"।
এম জাস্টিন

Arrays.toString()এটি তুলনামূলকভাবে Arrays.asList(list).toString()স্ট্রিং ফিরিয়ে দেওয়ার জন্য সংজ্ঞায়িত হওয়ার চেয়ে আরও ভাল পছন্দ হতে পারে , এটি আরও সংক্ষিপ্ত, এবং এটির জন্য অতিরিক্ত অবজেক্ট তৈরির প্রয়োজন হয় না।
এম জাস্টিন

@ এম জাস্টিন এই উত্তরের অ্যারে অংশের জন্য খারাপ বিষয় নয়, তবে একটি সরল "তালিকা" সম্পর্কে কী? আপনি এটিতে সত্যই আরে ডট স্ট্রিং () ব্যবহার করতে পারবেন না। আপনি উল্লিখিত অটোপোপুলেটিংলিস্টের মতো কিছুতে কীভাবে আপনি এই কৌশলটি ব্যবহার করার পরামর্শ দিবেন? হতে পারে: নতুন অ্যারেলিস্ট (অটোপোপুলেটিংলিস্ট)। টু স্ট্রিং ()? অথবা আমার ধারণা আপনি এটিকে অ্যারেতে রূপান্তর করতে পারেন। আপনি যদি এ জাতীয় সমস্যার মধ্যে পড়ে থাকেন তবে আপনার আশা করা উচিত যে আপনি 1.8 বা তার পরে আছেন এবং এই থ্রেডে অন্য উত্তরগুলির একটি ব্যবহার করতে পারেন ...
বিল কে

5

অন্য উত্তরগুলি ঠিক আছে। যাইহোক, আপনি উপাদানগুলি অ্যারেলিস্ট হিসাবে ফিরিয়ে আনতে স্ট্রিমাকলেক্ট () এ প্যারামিটার হিসাবে কালেক্টর.টললিস্ট () ও পাস করতে পারেন।

System.out.println( list.stream().map( e -> e.toString() ).collect( toList() ) );

আপনি যদি System.out.print(এলএন) (list)ব্যবহার করেন তবে toString()এটি তালিকা মুদ্রণের জন্য উপাদানগুলির পদ্ধতিটি ব্যবহার করবে । সুতরাং, কোডটির এই অংশটি কেবল toStringতালিকার তালিকার ভিতরে যা ঘটে তা পুনরাবৃত্তি করছে ।
শিরকম

1
স্ট্যাটিক আমদানি না করে কালেক্টর.টললিস্ট () হওয়া উচিত।
mwieczorek

হ্যাঁ ... উদাহরণস্বরূপ স্থিতি আমদানি করেছি। আমি বলেছি, "সংগ্রাহক। টু লিস্ট ()" উত্তরটির শরীরে ...;)
এডি বি

2

স্ট্রিংলিস্টনাম = অবজেক্টলিস্টনাম.স্ট্রিম ()। ম্যাপ (এম -> এম.টোস্ট্রিং ()) .ক্লোকলেট (সংগ্রাহক। টু লিস্ট ());


2

স্ট্রিং এপিআইতে "স্ট্রিংয়ের তালিকায় যোগদানের" ব্যবহারের ক্ষেত্রে একটি পদ্ধতি রয়েছে, আপনার এমনকি স্ট্রিমের প্রয়োজন নেই।

List<String> myStringIterable = Arrays.asList("baguette", "bonjour");

String myReducedString = String.join(",", myStringIterable);

// And here you obtain "baguette,bonjour" in your myReducedString variable

1
List<String> list = Arrays.asList("One", "Two", "Three");
    list.stream()
            .reduce("", org.apache.commons.lang3.StringUtils::join);

অথবা

List<String> list = Arrays.asList("One", "Two", "Three");
        list.stream()
                .reduce("", (s1,s2)->s1+s2);

এই পদ্ধতির সাহায্যে আপনাকে বস্তুর উদাহরণের উদাহরণ থেকে স্ট্রিং ফলাফলও তৈরি করতে দেয়

List<Wrapper> list = Arrays.asList(w1, w2, w2);
        list.stream()
                .map(w->w.getStringValue)
                .reduce("", org.apache.commons.lang3.StringUtils::join);

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

 List<String> errors = Arrays.asList("er1", "er2", "er3");
            list.stream()
                    .reduce("Found next errors:", (s1,s2)->s1+s2);

1

শাইল016 এবং বিপিড্রো উত্তর ( https://stackoverflow.com/a/24883180/2832140 ) এ প্রস্তাবিত উভয় পদ্ধতির পরীক্ষা করা , একটি লুপের মধ্যে সরল StringBuilder+ , এর চেয়ে আরও দ্রুত কার্যকর বলে মনে হয় ।append(String)forlist.stream().map([...]

উদাহরণ: এই কোডটি Map<Long, List<Long>>ব্যবহার করে একটি জসন স্ট্রিং তৈরি করে list.stream().map([...]:

if (mapSize > 0) {
    StringBuilder sb = new StringBuilder("[");

    for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {

        sb.append("{\"" + entry.getKey().toString() + "\":[");
        sb.append(entry.getValue().stream().map(Object::toString).collect(Collectors.joining(",")));
    }
    sb.delete(sb.length()-2, sb.length());
    sb.append("]");
    System.out.println(sb.toString());
}

আমার ডেভ ভিএম-তে, জুনিটটি সাধারণত পরীক্ষাটি চালাতে 0.35 থেকে 1.2 সেকেন্ডের মধ্যে সময় নেয়। এই নিম্নলিখিত কোডটি ব্যবহার করার সময়, এটি 0.15 এবং 0.33 সেকেন্ডের মধ্যে সময় নেয়:

if (mapSize > 0) {
    StringBuilder sb = new StringBuilder("[");

    for (Map.Entry<Long, List<Long>> entry : threadsMap.entrySet()) {

        sb.append("{\"" + entry.getKey().toString() + "\":[");

        for (Long tid : entry.getValue()) {
            sb.append(tid.toString() + ", ");
        }
        sb.delete(sb.length()-2, sb.length());
        sb.append("]}, ");
    }
    sb.delete(sb.length()-2, sb.length());
    sb.append("]");
    System.out.println(sb.toString());
}

0

আমরা কি এটি চেষ্টা করতে পারি?

public static void main(String []args){
        List<String> stringList = new ArrayList<>();
        for(int i=0;i< 10;i++){
            stringList.add(""+i);
        }
        String stringConcated = String.join(",", stringList);
        System.out.println(stringConcated);

    }

0
String actual = list.stream().reduce((t, u) -> t + "," + u).get();

7
সাধারণত কোডটি কীভাবে কাজ করে সে সম্পর্কে আপনার পোস্টে একটি ব্যাখ্যা যুক্ত করা ভাল ধারণা। এটি নতুন বিকাশকারীদের কোড কী করে তা বুঝতে সহায়তা করে।
কালেব ক্লেভেটার

1
@CalebKleveter এটি একটি হ্রাস Listএকটি একক থেকে String(এবং একটি কমা দিয়ে প্রতিটি উপাদান আলাদা ,)।
জো অলমোর

2
তালিকাটি যদি তালিকা <স্ট্রিং> হয় তবে কেবলমাত্র আপনার সমাধান কাজ করে। ওপি এই ধরণের শ্রেণি নির্দিষ্ট করে নি। তার প্রশ্নে এমনকি একটি তালিকা <ইন্টিগার> নির্দেশিত। আপনার কোড সেক্ষেত্রে সংকলন করে না।
রুবিআরিক

0

আমি পূর্ণসংখ্যার স্ট্রিমটিকে একক স্ট্রিংয়ে রূপান্তর করতে এপিআই স্ট্রিম ব্যবহার করব। প্রদত্ত কয়েকটি উত্তরের সাথে সমস্যা হ'ল স্ট্রিং বিল্ডিংয়ের কারণে তারা একটি O (n ^ 2) রানটাইম উত্পাদন করে। আরও ভাল সমাধান হ'ল স্ট্রিংবিল্ডার ব্যবহার করা এবং তারপরে স্ট্রিংগুলিকে চূড়ান্ত পদক্ষেপ হিসাবে যোগদান করা।

//              Create a stream of integers 
    String result = Arrays.stream(new int[]{1,2,3,4,5,6 })                
            // collect into a single StringBuilder
            .collect(StringBuilder::new, // supplier function
                    // accumulator - converts cur integer into a string and appends it to the string builder
                    (builder, cur) -> builder.append(Integer.toString(cur)),
                    // combiner - combines two string builders if running in parallel
                    StringBuilder::append) 
            // convert StringBuilder into a single string
            .toString();

আপনি অবজেক্টের সংগ্রহকে একক স্ট্রিংয়ে রূপান্তর করে এই প্রক্রিয়াটি আরও একধাপ এগিয়ে নিয়ে যেতে পারেন।

// Start with a class definition
public static class AClass {
    private int value;
    public int getValue() { return value; }
    public AClass(int value) { this.value = value; }

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

// Create a stream of AClass objects
        String resultTwo = Arrays.stream(new AClass[]{
                new AClass(1),
                new AClass(2),
                new AClass(3),
                new AClass(4)
        })
                // transform stream of objects into a single string
                .collect(StringBuilder::new,
                        (builder, curObj) -> builder.append(curObj.toString()),
                        StringBuilder::append
                )
            // finally transform string builder into a single string
            .toString();

-1

জাভা 8+ সহ

String s = Arrays.toString(list.stream().toArray(AClass[]::new));

সর্বাধিক দক্ষ নয়, তবে এটি একটি সামান্য পরিমাণের কোড সহ একটি সমাধান।


-2

এছাড়াও, আপনি এই মত করতে পারেন।

    List<String> list = Arrays.asList("One", "Two", "Three");
    String result = String.join(", ", list);
    System.out.println(result);

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