একটি অ্যারেলিস্টকে স্ট্রিংয়ে রূপান্তর করার সর্বোত্তম উপায়


353

আমার কাছে একটি রয়েছে ArrayListযা আমি স্ট্রিং হিসাবে সম্পূর্ণ আউটপুট করতে চাই। মূলত আমি toStringট্যাব দ্বারা বিভক্ত প্রতিটি উপাদান ব্যবহার করে এটি আউটপুট করতে চাই । এটি করার কোনও দ্রুত উপায় আছে? আপনি এটির মধ্য দিয়ে লুপ করতে পারেন (বা প্রতিটি উপাদান মুছে ফেলতে) এবং এটি একটি স্ট্রিংয়ের সাথে সংযুক্ত করতে পারেন তবে আমি মনে করি এটি খুব ধীর হবে।


4
বা প্রতিটি উপাদান মুছে ফেলুন সাবধান হন, অ্যারেলিস্ট তালিকা থেকে উপাদানগুলি সরিয়ে ফেলা বড় NO-NO নয়, কারণ আপনার "লুপ" স্থান পরিবর্তনকারী উপাদানগুলির কারণে দ্বিঘাতের সময় নেবে (আপনি প্রথম থেকে শেষ উপাদানটি লুপ করেন) তবে।
দিমিত্রি কে

উত্তর:


329

মূলত, এর উপর পুনরাবৃত্তি করতে একটি লুপ ব্যবহার করা ArrayListএকমাত্র বিকল্প:

এই কোডটি ব্যবহার করবেন না, কেন এটি পছন্দসই নয় এবং এর পরিবর্তে কোন কোডটি ব্যবহার করা উচিত তা দেখতে এই উত্তরটির নীচে পড়া চালিয়ে যান:

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

String listString = "";

for (String s : list)
{
    listString += s + "\t";
}

System.out.println(listString);

প্রকৃতপক্ষে, একটি স্ট্রিং কনটেনটেশন ঠিক জরিমানা হতে চলেছে, কারণ javacসংকলক যেভাবেই হোক না কেন appendক্রিয়াকলাপের সিরিজ হিসাবে স্ট্রিং কনটেনটেশনকে অনুকূল করে তুলবে StringBuilderforউপরের প্রোগ্রামটি থেকে লুপ থেকে বাইটকোডকে বিচ্ছিন্ন করার একটি অংশ এখানে দেওয়া হয়েছে :

   61:  new #13; //class java/lang/StringBuilder
   64:  dup
   65:  invokespecial   #14; //Method java/lang/StringBuilder."<init>":()V
   68:  aload_2
   69:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  aload   4
   74:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   77:  ldc #16; //String \t
   79:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   82:  invokevirtual   #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

যেমন দেখা যায়, সংকলকটি এটিকে ব্যবহার করে সেই লুপটিকে অনুকূল করে StringBuilder, তাই পারফরম্যান্স বড় উদ্বেগ হওয়া উচিত নয়।

(ঠিক আছে, দ্বিতীয় নজরে উপর, StringBuilderলুপ প্রতিটি পুনরাবৃত্তির উপর একটি সুনির্দিষ্ট ব্যবহার instantiated হচ্ছে, তাই এটি সবচেয়ে বেশি কার্যকরী বাইটকোড নাও হতে পারে। শুরু করতে গিয়ে এবং StringBuilderসম্ভবত ভাল পারফরম্যান্স উত্পাদ হবে।)

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

সম্পাদনা: মন্তব্যে নির্দেশিত হিসাবে, উপরোক্ত সংকলক অপ্টিমাইজেশন প্রকৃতপক্ষে StringBuilderপ্রতিটি পুনরাবৃত্তির উপর একটি নতুন উদাহরণ তৈরি করছে। (যা আমি আগে উল্লেখ করেছি।)

ব্যবহারের জন্য সবচেয়ে অপ্টিমাইজড কৌশলটি হ'ল পল টমবলিনের প্রতিক্রিয়া , কারণ এটি কেবল লুপের StringBuilderবাইরে কোনও একক বস্তুকে ইনস্ট্যান্ট করে for

উপরের কোডটিতে আবার লিখন:

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder();
for (String s : list)
{
    sb.append(s);
    sb.append("\t");
}

System.out.println(sb.toString());

কেবলমাত্র StringBuilderএকবার লুপের বাইরের দিকে তাত্ক্ষণিকভাবে কাজ করবে appendএবং এই বাইকোডে প্রমাণিত (যা StringBuilderলুপের ইনস্ট্যান্টেশন এবং লুপটি দেখায় ) হিসাবে লুপের অভ্যন্তরে পদ্ধতিতে কেবল দুটি কল করবে :

   // Instantiation of the StringBuilder outside loop:
   33:  new #8; //class java/lang/StringBuilder
   36:  dup
   37:  invokespecial   #9; //Method java/lang/StringBuilder."<init>":()V
   40:  astore_2

   // [snip a few lines for initializing the loop]
   // Loading the StringBuilder inside the loop, then append:
   66:  aload_2
   67:  aload   4
   69:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  pop
   73:  aload_2
   74:  ldc #15; //String \t
   76:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   79:  pop

সুতরাং, প্রকৃতপক্ষে হাতের অপ্টিমাইজেশনটি আরও ভালভাবে সম্পাদন করা উচিত, কারণ লুপটির অভ্যন্তরটি forছোট হয় এবং StringBuilderপ্রতিটি পুনরাবৃত্তির উপর একটি ইনস্ট্যান্ট করার দরকার নেই to


8
পারফরম্যান্সের কারণে, কেবল স্ট্রিং যুক্ত করার পরিবর্তে একটি স্ট্রিংবিল্ডার শ্রেণি ব্যবহার বিবেচনা করুন।
জেরেমি

5
এই সংকলকটি স্ট্রিং কনটেনটেশনকে সর্বোত্তম করে তুলবে তবে প্রতিবার লুপটি কার্যকর করার সময় আপনি একটি নতুন স্ট্রিংবিল্ডার অবজেক্ট তৈরি করবেন।
পেড্রো হেনরিক্স

4
+1 ব্যবহারের জন্য -1, এক্ষেত্রে এটি একটি পারফরম্যান্স হত্যাকারী। স্ট্রিংবিল্ডারটি সর্বদা স্ট্রিংয়ের সাথে পুনরাবৃত্তির জন্য ব্যবহার করুন।
স্টার ব্লু

10
এই সমাধানটি স্ট্রিংয়ের শেষে অতিরিক্ত "\ t" যুক্ত করে যা প্রায়শই অনাকাঙ্ক্ষিত হয়, বিশেষত যখন আপনি কমা দ্বারা পৃথক তালিকা তৈরি করতে চান বা অনুরূপ। আমি মনে করি অ্যাপাচি কমন্স বা পেয়ারা ব্যবহার করে এখানে পোস্ট করা অন্যান্য সমাধানগুলি সর্বোত্তম।
পিটার গয়েটজ

3
এটি সেরা উত্তর নয়। নীচে Javaভিটালি বা জিওক্সের জন্য দেখুনAndroid
গিবল্ট

895

জাভা 8 বা তার পরে:

String listString = String.join(", ", list);

যদি listস্ট্রিং টাইপ না হয়, একটি যোগদানকারী সংগ্রাহক ব্যবহার করা যেতে পারে:

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

144
আমি এটি যুক্ত করতে জাভা 8 অবধি গ্রহণ করতে পারি না।
পল

45
এই উত্তরটি আরও বেশি ভোট দেওয়া উচিত! কোনও হ্যাক নেই, লাইব্রেরি নেই এবং লুপ নেই।
সানগো

4
এটি ওপি যা বলেছিল তাতে কাজ করে না। স্ট্রিং.জাইন দ্বিতীয় আর্গুমেন্ট হিসাবে গ্রহণযোগ্য <? CharSequence> প্রসারিত করে। সুতরাং এটি কাজ করে যদি আপনার কাছে একটি তালিকা <স্ট্রিং> থাকে যা আপনি প্রদর্শন করতে চান তবে আপনার যদি <মাইবজেক্ট> তালিকান থাকে তবে এটি ওপি

3
কেন এটি প্রথম (এবং স্বীকৃত) উত্তর হ'ল না .. আমি যতক্ষণ না জানি সেখানে উপস্থিত থাকতেই আমাকে সর্বদা স্ক্রোল করতে হবে .. মার্জিত এবং সংক্ষিপ্ত
জ্যাক

2
অ্যান্ড্রয়েড API
26+

391

যদি আপনি অ্যান্ড্রয়েডে এটি করে চলেছেন তবে একটি দুর্দান্ত ইউটিলিটি রয়েছে এটি নামক টেক্সটUtils এর একটি .join(String delimiter, Iterable)পদ্ধতি রয়েছে has

List<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
String joined = TextUtils.join(", ", list);

স্পষ্টতই অ্যান্ড্রয়েডের বাইরে খুব বেশি ব্যবহার হয়নি, তবে মনে হয়েছে আমি এটিকে এই থ্রেডে যুক্ত করব ...


1
যেহেতু এটি TextUtils.joinগ্রহণ করে Object[], আমি ধরে নিই যে এটি toString()প্রতিটি টোকেনে ডাকছে । না PatientDetailsবাস্তবায়ন toString()? যদি এটি সমস্যার সমাধান না করে, আপনি Separatorক্লাসের সাথে কিছু করতে আটকে থাকতে পারেন ।
জেজে গিভাক্স

5
org.apache.lang3.StringUtilsকার্যত একই কাজ করে, তাই আপনার উত্তরটি অ্যান্ড্রয়েডের বাইরে আমার পক্ষে একেবারে ব্যবহারযোগ্য ছিল :)
প্যাট্রিক

1
এই উত্তরটি জনপ্রিয়তা শো আপনি যে অনেক জাভা প্রশ্ন Android বিকাশ থেকে ডাঁটা (বর্তমানে সর্বোচ্চ এক ভোট)
আমর এইচ আব্দ Elmajeed

1
আমি বাজি ধরতে পারি যে আমার সমস্যা সমাধানের জন্য আপনাকে এই পৃথিবীতে পাঠানো হয়েছিল :)
কোফওরোলা

1
আপনি আমার জীবন বাঁচিয়েছেন। <3
প্রতীক বুটানি

234

অ্যাপাচি কমন্স ল্যাং ডাউনলোড করুন এবং পদ্ধতিটি ব্যবহার করুন

 StringUtils.join(list)

 StringUtils.join(list, ", ") // 2nd param is the separator.

আপনি অবশ্যই এটি নিজের দ্বারা বাস্তবায়ন করতে পারেন, তবে তাদের কোডটি পুরোপুরি পরীক্ষিত এবং সম্ভবত এটি সম্ভাব্য সর্বোত্তম বাস্তবায়ন।

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


63
দুর্ভাগ্যক্রমে, এসও এর ডেনিজেনরা চাকাটি পুনরায় উদ্ভাবন করতে পছন্দ করে।
স্কাফম্যান

33
অ্যাপাচি কমন্স ল্যাং এও। ব্যবহারটি দেখতে দেখতে হবেStringUtils.join(list.toArray(),"\t")
মুহাম্মদ

33
এই নির্দিষ্ট চাকা অতিরিক্ত নির্ভরতার সাথে কমই মূল্যবান।
সেবা আলেকসেয়েভ

25
@ শেভাআলেকসিয়েভ আমি মনে করি এটি বিতর্কযোগ্য। আপনি যদি এই মুহূর্তে এই নির্ভরতা যুক্ত করেন তবে আপনি এর ক্লাসগুলি ব্যবহার না করে প্রায়শই ব্যবহার করবেন। "If স্ট্রিং! = নাল এবং অ্যান্ড স্ট্রিং .trim ()! =" "ব্যবহার করার পরিবর্তে আপনি স্ট্রিংইটিলস.আইসনটম্পিটি ব্যবহার করবেন ... আপনি অবজেক্ট ইউটিস.ইকয়ালস () ব্যবহার করবেন যাতে আপনাকে সর্বত্র নাল পরীক্ষা করতে হবে না। তবে আপনি যদি এই লাইব্রেরিগুলি ব্যবহার করে ন্যায়সঙ্গত করে এমন এক নির্ভরতার জন্য অপেক্ষা করেন, তবে আপনি সম্ভবত সেগুলি কখনই ব্যবহার করতে পারবেন না
রবি ওয়ালাউ

6
এটিও দুর্দান্ত যে এটি শেষে কোনও অতিরিক্ত ট্যাব যুক্ত করবে না!
কেউলেজে

139

এটি বেশ পুরানো প্রশ্ন, তবে আমি অনুমান করি যে আমি আরও আধুনিক উত্তর যুক্ত করতে পারি - পেয়ারাJoiner থেকে ক্লাসটি ব্যবহার করুন :

String joined = Joiner.on("\t").join(list);

2
এটি আমার প্রিয় সমাধান। : -> পেয়ারার জন্য +1।
csgeek

পেয়ারার জন্যও Ctrl + F'd। ধন্যবাদ!
প্রিয়দু নিমরে

তালিকা <স্ট্রিং> তালিকা = নতুন অ্যারেলিস্ট <স্ট্রিং> (); list.add ( "হ্যালো"); list.add ( "হ্যায়"); list.add ( "হাই"); সিস্টেম.আউট.প্রিন্টলন (list.toString ()। স্ট্রিং (1, list.toString ()। দৈর্ঘ্য () - 1) .replaceAll (",", "\ t"));
লোভা চিত্তুমুরি

86

পরিবর্তন তালিকা একটি পাঠযোগ্য ও অর্থপূর্ণ করার স্ট্রিং সত্যিই একটি সাধারণ প্রশ্ন যে প্রতি এক সম্মুখীন হতে পারে।

মামলা 1 । আপনার শ্রেণির পথে যদি অ্যাপাচের স্ট্রিংগলগুলি থাকে (যেমন রজারডপ্যাক এবং রবি ওয়ালাউ) থেকে:

import org.apache.commons.lang3.StringUtils;
String str = StringUtils.join(myList);

মামলা 2 । আপনি যদি কেবল জেডিকে (7) এর উপায় ব্যবহার করতে চান:

import java.util.Arrays;
String str = Arrays.toString(myList.toArray()); 

কখনই নিজের দ্বারা চাকা তৈরি করবেন না, এই এক-লাইন কাজের জন্য লুপ ব্যবহার করবেন না।


1
আমার নিজের পোস্ট করার আগে আমি আপনার কেস 2 সমাধানটি লক্ষ্য করিনি। আপনার প্রকৃতপক্ষে আরও ভাল এবং অতিরিক্ত পদক্ষেপটি সংরক্ষণ করে। আমি অতিরিক্ত উত্তরের প্রয়োজন বলে মনে হচ্ছে এমন উত্তরগুলির কয়েকটিতে অবশ্যই এটি সুপারিশ করব।
এলিয়েন্ডার

5
Arrays.toString(myList.toArray())- সবচেয়ে সহজ এবং সর্বাধিক সরল সমাধান
ndন্দ্রজ বোজাক

আমি মনে করি এটিকে সেরা এবং সবচেয়ে কার্যকর সমাধান হিসাবে বিবেচনা করা উচিত
মোরে

Arrays.toString(list.toArray())লিখতে সহজ, তবে অত্যন্ত অদক্ষ।
ম্যাথিউইউ

60

আপনি যদি জাভা 5 হিসাবে দ্রুত ওয়ান-লাইনার সন্ধান করেন তবে আপনি এটি করতে পারেন:

myList.toString().replaceAll("\\[|\\]", "").replaceAll(", ","\t")

তদ্ব্যতীত, যদি আপনার উদ্দেশ্য কেবল বিষয়বস্তু মুদ্রণ করা এবং "\ t" সম্পর্কে কম উদ্বিগ্ন হয় তবে আপনি কেবল এটি করতে পারেন:

myList.toString()

যা স্ট্রিংয়ের মতো করে দেয়

[টিআরআর, টিআর 2, স্ট্র 3

আপনার যদি অ্যারে থাকে (অ্যারেলিস্ট নয়) তবে আপনি এটির মতো কাজটি করতে পারেন:

 Arrays.toString(myList).replaceAll("\\[|\\]", "").replaceAll(", ","\t")

3
আমি মনে করি এটি প্রকৃতপক্ষে আরও কার্যকর যে পদ্ধতিগুলি উপরে পোস্ট করেছে। এমন লজ্জা এটি নীচে দেখানো হয়েছে। এটি মার্জিত নাও হতে পারে তবে আমি দৃ strongly়ভাবে বিশ্বাস করি যে আপনার সমাধান ও (এন) চালায় অন্যেরা তাত্ত্বিকভাবে ও (এন ^ 2) তে চালাচ্ছেন (যেহেতু জাভা স্ট্রিংগুলি আপনি মূলত প্রতিটি সংশ্লেষে একটি নতুন স্ট্রিং তৈরি করেন এবং এটি আরও খারাপ হয়ে যায় ফলস্বরূপ স্ট্রিং বড় হয়ে যায়)
ব্যবহারকারীর 3790827

যদি আপনার পাঠ্যটি খুব বড় হয় তবে আপনি নিজের কম্পিউটারের সংস্থানগুলি খাবেন।
ব্যবহারকারীর 3790827

এই পদ্ধতিটি স্ট্রিংবিল্ডার ব্যবহারের চেয়ে 7-8 গুণ বেশি ধীর।
জোকা

@ user3790827 আপনি একটি খুব পৃষ্ঠের স্তর খুঁজছেন। যদি আমি আপনাকে বলি রাজ্যের শহরগুলিতে mপরিবারের কোনও ব্যক্তির সন্ধানের জন্য , আপনি বলবেন বা এটি আছে , তবে আমি "এই দেশে এই ব্যক্তির সন্ধান করুন" বলার জন্য এটি পুনর্বিবেচনা করতে পারি এবং আপনি তাত্ক্ষণিকভাবে আমাকে বলবেন । তার উপরে, এখানে সমস্ত অ্যালগোরিদম সাধারণত হয় , একটি লুপের মধ্যে কোনও লুপিং থাকে না । nxO(mnx)O(n^3)O(n)O(n)
জয়

39

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

StringBuilder out = new StringBuilder();
for (Object o : list)
{
  out.append(o.toString());
  out.append("\t");
}
return out.toString();

ধন্যবাদ! এটিই আমি শেষ করছি :)
জুয়ান বেসা

4
বড় অ্যারেগুলির জন্য এটি অবশ্যই মাইক্রো-অপ্টিমাইজিং নয়। স্ট্রিংবিল্ডার ব্যবহারের জন্য স্বয়ংক্রিয় রূপান্তরটি প্রতিটি স্ট্রিং কনটেনটেশনের জন্য পৃথকভাবে করা হয়, যা লুপের ক্ষেত্রে সহায়তা করে না। আপনি যদি একটি অভিব্যক্তিতে বিপুল সংখ্যক উপাদানকে সম্মতি দেন তবে তা ঠিক।
স্টার ব্লু

1
স্ট্রিংবিল্ডার স্পষ্টভাবে ব্যবহার করা একটি বড় কথা, যদি আপনি সম্মতি দিচ্ছেন বলুন যে 50 000 স্ট্রিংগুলি ~ 1 এমবি ফলাফলের স্ট্রিং তৈরি করে - এটি 1 টি এক্সিকিউশন সময়ের সাথে তুলনায় 1 মিনিটের একটি পার্থক্য হতে পারে।
মিঃ নাপিক

36

বেশিরভাগ জাভা প্রকল্পগুলিতে প্রায়শই অ্যাপাচি-কমন্স ল্যাং পাওয়া যায়। স্ট্রিংউটিলস.জাইন () পদ্ধতিগুলি খুব সুন্দর এবং প্রায় প্রতিটি প্রয়োজন মেটাতে বিভিন্ন স্বাদ রয়েছে।

public static java.lang.String join(java.util.Collection collection,
                                    char separator)


public static String join(Iterator iterator, String separator) {
    // handle null, zero and one elements before building a buffer 
    Object first = iterator.next();
    if (!iterator.hasNext()) {
        return ObjectUtils.toString(first);
    }
    // two or more elements 
    StringBuffer buf = 
        new StringBuffer(256); // Java default is 16, probably too small 
    if (first != null) {
        buf.append(first);
    }
    while (iterator.hasNext()) {
        if (separator != null) {
            buf.append(separator);
        }
        Object obj = iterator.next();
        if (obj != null) {
            buf.append(obj);
        }
    }
    return buf.toString();
}

পরামিতি:

সংগ্রহ - একত্রে যোগদানের মানগুলির সংগ্রহটি শূন্য হতে পারে

বিভাজক - পৃথককারী চরিত্রটি ব্যবহার করতে হবে

রিটার্নস : যুক্ত স্ট্রিং, নাল ইটারেটর ইনপুট হলে নাল

যেহেতু: 2.3


2
এটি খুব সুন্দর কারণ join(...)পদ্ধতিতে অ্যারে এবং সংগ্রহ উভয়ের জন্য বৈকল্পিক রয়েছে।
ভাইকিংস্টিভ

আমার এলোমেলো সংখ্যা সহ বিরল জনবহুল উপাদানগুলির সাথে স্ট্রিংয়ের সংগ্রহ তৈরি করতে হবে। শেষে আমার স্ট্রিং দরকার, অ্যারে স্ট্রিংয়ের অ্যারে নয়। এটি আমার কোড: কালেকশনস্ফাল (এল); স্ট্রিংবিল্ডার এসবি = নতুন স্ট্রিংবিল্ডার (); L.forEach (e -> sb.append (e)); রিটার্ন sb.toString ();
dobrivoje

18

অ্যান্ড্রয়েডের একটি টেক্সটিল ক্লাস রয়েছে যা আপনি http://developer.android.com/references/android/text/TextUtils.html ব্যবহার করতে পারেন

String implode = TextUtils.join("\t", list);

এই সমাধানটি স্ট্রিং.জোঁইনের চেয়ে ভাল, যার জন্য এপিআই
26+

14

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

String csv = String.join("\t", yourArray);

অন্যথায় কমন্স-ল্যাংয়ের একটি যোগদান () পদ্ধতি রয়েছে:

String csv = org.apache.commons.lang3.StringUtils.join(yourArray, "\t");

13

পিছনে বিচ্ছেদ চরিত্রগুলি মোকাবেলার একটি দুর্দান্ত উপায় হ'ল ক্লাস সেপারেটর ব্যবহার করা

StringBuilder buf = new StringBuilder();
Separator sep = new Separator("\t");
for (String each: list) buf.append(sep).append(each);
String s = buf.toString();

ক্লাস বিভাজকের টুস্ট্রিং পদ্ধতিটি প্রথম কল ব্যতীত বিভাজকটি ফেরত দেয় । সুতরাং আমরা নেতৃস্থানীয় বিভাজকগুলি অনুসরণ না করে (বা এই ক্ষেত্রে) তালিকাটি মুদ্রণ করি।


8

জাভা 8 এ এটি সহজ। পূর্ণসংখ্যার তালিকার উদাহরণ দেখুন:

String result = Arrays.asList(1,2,3).stream().map(Object::toString).reduce((t, u) -> t + "\t" + u).orElse("");

বা মাল্টলাইন সংস্করণ (যা পড়তে সহজ):

String result = Arrays.asList(1,2,3).stream()
    .map(Object::toString)
    .reduce((t, u) -> t + "\t" + u)
    .orElse("");

আপডেট - একটি সংক্ষিপ্ত সংস্করণ

String result = Arrays.asList(1,2,3).stream()
                .map(Object::toString)
                .collect(Collectors.joining("\t"));

2
এটি কেবল কোডের একটি লাইন হতে পারে তবে আমার কাছে এটি সহজ দেখাচ্ছে না। আমার জন্য তালিকাটি ট্র্যাভার করা এবং এর উপাদানগুলিকে স্ট্রিংয়ে পার্স করা এর চেয়ে সহজ।
বার্টজিলা

1
এটি আমার প্রথম ছাপও ছিল। তবে আমি এটির অভ্যস্ত হওয়ার পরে আমি এটি দুর্দান্ত দেখতে পাই। উদাহরণস্বরূপ আপনি যেমন অপারেশন যোগ করতে পারেন filter। শেষ পর্যন্ত কোডটি পড়া আমার পক্ষে অনেক সহজ।
amra

3
জাভা 8 এ: স্ট্রিং.জোঁইন ("\ t", অ্যারে)
টমাসজ

সর্বশেষ মন্তব্যটি কেবল তখনই কাজ করে যদি সামগ্রীটি Stringপাশাপাশি থাকে a যদি এর তালিকাভুক্ত হয় তবে Integerআপনার সমস্যা আছে
লিও

এর মধ্যে 3 টিরই অ্যান্ড্রয়েডের এপিআই স্তরের 24 প্রয়োজন।
আসাদ 35 ওয়াহেদ

6

এটা একটা O(n) কোনওভাবেই অ্যালগরিদম (যদি না আপনি কয়েকটি মাল্টি-থ্রেড সমাধান না করেন যেখানে আপনি তালিকাটিকে একাধিক সাবলিস্টে বিভক্ত করেন তবে আমি মনে করি না যে এটি আপনি যা চাইছেন)।

কেবল StringBuilderনীচে হিসাবে ব্যবহার করুন :

StringBuilder sb = new StringBuilder();

for (Object obj : list) {
  sb.append(obj.toString());
  sb.append("\t");
}

String finalString = sb.toString();

StringBuilderস্ট্রিং সংযুক্তকরণের তুলনায় অনেক দ্রুততর হবে কারণ আপনার পুনরায় শুরু করতে গিয়ে একটি হবে না হবে Stringপ্রতিটি সংযুক্তকরণের উপর বস্তু।


5

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

public static <T> String asString(List<T> list) {
    return StreamSupport.stream(list)
            .map(Object::toString)
            .collect(Collectors.joining("\n"));
}

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


1
reduceস্ট্রিং কনকনেটেশনের জন্য ব্যবহার করা চূড়ান্ত অদক্ষ। আপনি এটা জাভা 8 উপায় কী করা উচিত return StreamSupport.stream(list).map(Object::toString).collect(joining("\n"))যা অভ্যন্তরীণভাবে ব্যবহার StringJoinerস্ট্রিমসপোর্টের সাহায্যে আপনি এটি করতে না পারার কোনও কারণ নেই ।
স্টিফান জোবেল

আরেকটি বিষয় হ'ল আপনার কোডটি Optional#getযদি খালি তালিকায় পাস করে তবে ভয়াবহভাবে (এর কারণে ) ব্যর্থ হবে ।
স্টিফান জোবেল

@ স্টেফানজোবেল দক্ষতা এবং এজ কেস সম্পর্কিত বিষয়গুলি নির্দেশ করার জন্য ধন্যবাদ Thanks কোড পরিবর্তন করা হয়েছে।
জাভাদ সাদেকজাদেহ

3

আপনি যদি শেষ উপাদানটির পরে শেষ want t না চান তবে আপনাকে সূচীটি পরীক্ষা করতে ব্যবহার করতে হবে, তবে মনে রাখবেন যে তালিকাগুলি র্যান্ডমএ্যাক্সেস প্রয়োগ করলে এটি কেবল "কাজ করে" (যেমন ও (এন)) থাকে।

List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder(list.size() * apprAvg); // every apprAvg > 1 is better than none
for (int i = 0; i < list.size(); i++) {
    sb.append(list.get(i));
    if (i < list.size() - 1) {
        sb.append("\t");
    }
}
System.out.println(sb.toString());

3

নীচের কোডটি আপনাকে সহায়তা করতে পারে,

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
String str = list.toString();
System.out.println("Step-1 : " + str);
str = str.replaceAll("[\\[\\]]", "");
System.out.println("Step-2 : " + str);

আউটপুট:

Step-1 : [1, 2, 3]
Step-2 : 1, 2, 3

3

সেরা উপায় না, তবে মার্জিত উপায় হতে পারে।

অ্যারে.দীপটিস্টোস্ট্রিং (অ্যারে.এএসলিস্ট ("টেস্ট", "টেস্ট 2")

import java.util.Arrays;

    public class Test {
        public static void main(String[] args) {
            System.out.println(Arrays.deepToString(Arrays.asList("Test", "Test2").toArray()));
        }
    }

আউটপুট

[পরীক্ষা, টেস্ট 2]


1
আমি মনে করি এটি "সেরা" মানে কোড পঠনযোগ্যতা if আমি কোডটির দিকে নজর দিইনি, তবে এটি সম্ভবত স্ট্রিংবিল্ডার পদ্ধতির মতোই দক্ষ (এটি সম্ভবত হুডের নিচে স্ট্রিংবিল্ডার ব্যবহার করে) যদিও আউটপুটটিতে কাস্টমাইজযোগ্য নয়।
মাইক মিলার

3

নিম্নলিখিত কোনও ভাল হবে:

List<String> streamValues = new ArrayList<>();
Arrays.deepToString(streamValues.toArray()));   

3

আপনি যদি গ্রিপস সংগ্রহগুলি ব্যবহার করছেন তবে আপনি makeString()পদ্ধতিটি ব্যবহার করতে পারেন ।

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

Assert.assertEquals(
    "one\ttwo\tthree",
    ArrayListAdapter.adapt(list).makeString("\t"));

আপনি আপনার রূপান্তর করতে পারেন ArrayListএকটি থেকে FastList, আপনি অ্যাডাপ্টারের পরিত্রাণ পেতে পারেন।

Assert.assertEquals(
    "one\ttwo\tthree",
    FastList.newListWith("one", "two", "three").makeString("\t"));

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ।


3
List<String> stringList = getMyListOfStrings();
StringJoiner sj = new StringJoiner(" ");
stringList.stream().forEach(e -> sj.add(e));
String spaceSeparated = sj.toString()

আপনি বিভাজনকারী new StringJoinerহিসাবে ব্যবহার করতে চান চর ক্রমটি পাস করুন to আপনি যদি কোনও সিএসভি করতে চান:new StringJoiner(", ");


3

এক লাইনে: [12,0,1,78,12] থেকে 12 0 1 78 12 পর্যন্ত

String srt= list.toString().replaceAll("\\[|\\]|,","");

2
1) এর মতো কোড আর ব্যবহার করার কোনও কারণ নেই (4 বছর আগের হিসাবে!)। 2) এই উত্তরটি প্রশ্নোত্তরটিতে কিছু যুক্ত করে না।
রেডিওডেফ

এক লাইনে 5 তারা। অনেক ধন্যবাদ.
আতেফ ফারুক

এটি পুরোপুরি কাজ করে। কমা দ্বারা পৃথক স্ট্রিং ব্যবহারের জন্য: স্ট্রিং srt = list.toString ()। রিপ্লেসএল ("\ [| \]", "");
আসাদ 35 ওয়াহেদ

2

ট্যাব ব্যবহার seperating পরিবর্তে ব্যবহার করার জন্য println আপনি ব্যবহার করতে পারেন মুদ্রণ

ArrayList<String> mylist = new ArrayList<String>();

mylist.add("C Programming");
mylist.add("Java");
mylist.add("C++");
mylist.add("Perl");
mylist.add("Python");

for (String each : mylist)
{       
    System.out.print(each);
    System.out.print("\t");
}

1

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

    List<Account> accounts = new ArrayList<>();

   public String accountList() 
   {
      Account[] listingArray = accounts.toArray(new Account[accounts.size()]);
      String listingString = Arrays.toString(listingArray);
      return listingString;
   }

0

এটি এখন দ্বারা বেশ পুরনো কথোপকথন এবং Apache কমন্স এখন অভ্যন্তরীণভাবে একটি StringBuilder ব্যবহার করছেন: http://commons.apache.org/lang/api/src-html/org/apache/commons/lang/StringUtils.html#line। 3045

এটি হিসাবে আমরা জানি পারফরম্যান্সের উন্নতি হবে, তবে যদি পারফরম্যান্স সমালোচনা হয় তবে ব্যবহৃত পদ্ধতিটি কিছুটা অক্ষম হতে পারে। যদিও ইন্টারফেসটি নমনীয় এবং বিভিন্ন সংগ্রহের ধরণের ক্ষেত্রে সামঞ্জস্যপূর্ণ আচরণের অনুমতি দেয় এটি তালিকার পক্ষে কিছুটা অক্ষম, যা মূল প্রশ্নে সংগ্রহের ধরণ।

আমি এটি বেস করছি যে আমরা কিছু ওভারহেড ব্যয় করছি যা আমরা লুপের জন্য একটি traditionalতিহ্যগতভাবে উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করে এড়াতে পারি। পরিবর্তে কিছু অতিরিক্ত জিনিস ঘটছে পর্দার আড়ালে যা যুগপত পরিবর্তনগুলি, মেথড কল ইত্যাদির জন্য চেক করছে তা অন্যদিকে লুপের জন্য বর্ধিত হ'ল একই ওভারহেডের ফলস্বরূপ যেটি আইট্রেটারটি আইট্রেটাল অবজেক্টে (তালিকা) ব্যবহৃত হয় সেটির ফলস্বরূপ।


0

আপনি এটির জন্য একটি রেজেক্স ব্যবহার করতে পারেন। এটি যতটা সংক্ষিপ্ত তা পায়

System.out.println(yourArrayList.toString().replaceAll("\\[|\\]|[,][ ]","\t"));

-1

এই ফাংশনটি সম্পর্কে কীভাবে:

public static String toString(final Collection<?> collection) {
    final StringBuilder sb = new StringBuilder("{");
    boolean isFirst = true;
    for (final Object object : collection) {
        if (!isFirst)
            sb.append(',');
        else
            isFirst = false;
        sb.append(object);
    }
    sb.append('}');
    return sb.toString();
}

এটি যে কোনও ধরণের সংগ্রহের জন্য কাজ করে ...

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