জাভা: পিএইচপি এর যোগদানের মতো অ্যারেগুলির জন্য ফাংশন ()?


259

আমি String[]একটি আঠালো স্ট্রিং সঙ্গে একটি যোগ দিতে চাই । এর জন্য কোন অনুষ্ঠান আছে?


7
জাভা 8 এর কার্যকারিতাটি বাক্সের বাইরে অন্তর্ভুক্ত রয়েছে। আমি পাঠককে @ মারেক গ্রেগোর (এবং এটি উপস্থাপন করুন ..) দ্বারা উত্তরটি স্ক্রোল করার পরামর্শ দিচ্ছি
স্টাভ

উত্তর:


307

জাভা 8 থেকে শুরু করে এটি ব্যবহার করা সম্ভব String.join()

String.join(", ", new String[]{"Hello", "World", "!"})

উত্পন্ন:

Hello, World, !

অন্যথায়, অ্যাপাচি কমন্স ল্যাংয়ের একটি StringUtilsক্লাস রয়েছে যার একটি joinফাংশন রয়েছে যা একটি তৈরি করতে একসাথে অ্যারে যোগদান করবে String

উদাহরণ স্বরূপ:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

নিম্নলিখিত উত্পন্ন করে String:

Hello, World, !

7
এই উত্তরটি অনুসন্ধান করার সুবিধার্থে, সম্ভবত এটি লক্ষ করা উচিত যে এটি পার্ল যোগদানের সমতুল্য।
কে-ডেন

3
এটি বলেছে এটি আমার জন্য
অপরিজ্ঞাত

@ নিনজ্যাক্সর 1. কমন্স-ল্যাং * জারটি অবশ্যই ক্লাসপথে থাকতে হবে 2. আমদানি করুন org.apache.commons.lang3.StringUtils;
পিটারহ - মনিকা পুনরায় স্থাপন করুন

9
আমি String.join()জাভা ৮-তে প্রবর্তিত নতুন পদ্ধতির একটি রেফারেন্স সংযোজন করার জন্য আপনাকে এই উত্তরটি সম্পাদনা করার পরামর্শ দিচ্ছি This এইভাবে, বিপুল সংখ্যক লোকেরা এই স্বীকৃত উত্তরটি পড়ে সেই জ্ঞানটি থেকে উপকৃত হবে। বর্তমানে, এই সত্যটি উল্লেখ করে সর্বাধিক ভোট দেওয়া উত্তর বরং নীচে হারিয়ে গেছে ...
ডানকান জোন্স

1
এটি String.join()শুধুমাত্র List<CharSequence>বা CharSequence[]উপাদানগুলির জন্য কাজ করবে তা উল্লেখযোগ্য ।
এনিগো

71

আপনি যদি অ্যান্ড্রয়েডে কী ব্যবহার করবেন তা যদি সন্ধান করে থাকেন তবে তা হ'ল:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

উদাহরণ স্বরূপ:

String joined = TextUtils.join(";", MyStringArray);

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

এটি সেপ্টেম্বর 2017, অ্যান্ড্রয়েডের জাভা 8 এখনও অনেক দূরে। এই উত্তরের জন্য ধন্যবাদ!
এনাডন

57

জাভা 8 এ আপনি ব্যবহার করতে পারেন

1) স্ট্রিম এপিআই:

String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));

2) নতুন স্ট্রিং.জয়িন পদ্ধতি: https://stackoverflow.com/a/21756398/466677

3) java.util.StringJoiner শ্রেণি: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html


53

আপনি কোডের দশটি লাইনে সহজেই এই জাতীয় ফাংশন লিখতে পারেন:

String combine(String[] s, String glue)
{
  int k = s.length;
  if ( k == 0 )
  {
    return null;
  }
  StringBuilder out = new StringBuilder();
  out.append( s[0] );
  for ( int x=1; x < k; ++x )
  {
    out.append(glue).append(s[x]);
  }
  return out.toString();
}

35
আপনার মতে ভাল অনুশীলন ... এই জাতীয় জিনিসগুলির জন্য কোনও সার্বজনীন মান নেই।
ফোবিস

24
তবে আমি যদি ধনুর্বন্ধনী অন্তর্ভুক্ত করি, তা কোডের আরও দুটি লাইন যুক্ত করত, এবং আমি এটি 11 লাইনে এটি করার দাবি করতে পারতাম না!
জয় 21

8
সমস্যাটি হ'ল যখন আপনি কিছুক্ষণ পরে, বা অন্য কারও তাড়াহুড়ো করে, এতে অন্য লাইন যুক্ত করুন যদি / জন্য বন্ধনী যুক্ত না করে; অথবা যদি (k == 0) পরে রিটার্ন নাল মুছুন, তবে কিছু ক্ষেত্রে এটি সংকলন করে তবে ভুল হবে। তারপরে সেই বন্ধ বন্ধনীটির জন্য একটি অতিরিক্ত লাইন বলিদান করা ভাল (প্রারম্ভিকভাবে / যদি লাইনটির জন্য একইভাবে থাকতে পারে)।
মিলন

16
আমি মনে করি এটি অত্যন্ত দুর্দান্ত যে বেশিরভাগ ভাষাগুলি যখন তাদের মূল বৈশিষ্ট্যে এই জাতীয় কার্যকারিতা প্যাক করে, জাভা সম্প্রদায় সবাইকে চক্রটিকে পুনরায় উদ্দীপনায় উত্সাহিত করে।
জন স্ট্রিকলার

33
11 লাইন? বাঃ! আমি এটা করতে পারি! সোর্স ফাইলে সমস্ত নিউলাইন অক্ষর কেবল সরান।
থমাস এডিং

25

সাবস্ট্রিং () ব্যবহার করার পরিবর্তে কিছুটা মোড:

//join(String array,delimiter)
public static String join(String r[],String d)
{
        if (r.length == 0) return "";
        StringBuilder sb = new StringBuilder();
        int i;
        for(i=0;i<r.length-1;i++){
            sb.append(r[i]);
            sb.append(d);
        }
        sb.append(r[i]);
        return sb.toString();
}

ভোট দেওয়া হয়েছে কারণ আপনার কোনও লাইব্রেরি যুক্ত করার দরকার নেই।
givanse

10
লাইন:: যদি .append()প্রতিটিের জন্য দু'বার ব্যবহারের Stringপরিবর্তে তাদেরকে সম্মতি না দিয়ে পুনরায় বিল্ডারের সাথে যুক্ত করা হয় তবে এটি কি ভাল ।
তালহা আহমেদ খান

18

ইদানীং অনেক প্রশ্নের সাথে, জাভা 8 উদ্ধার করতে:


জাভা 8 একটি নতুন স্থিতিশীল পদ্ধতি যুক্ত করেছে java.lang.Stringযা আপনি যা চান ঠিক তা করে:

public static String join(CharSequence delimeter, CharSequence... elements);

এটি ব্যবহার করছি:

String s = String.join(", ", new String[] {"Hello", "World", "!"});

ফলাফল স্বরূপ:

"Hello, World, !"

14

গুগল পেয়ারার লাইব্রেরিতেও এই ধরণের ক্ষমতা রয়েছে । আপনি স্ট্রিং [] উদাহরণ এপিআই থেকেও দেখতে পাবেন।

ইতিমধ্যে এপিআই-তে বর্ণিত হিসাবে, নির্মাতা পদ্ধতিগুলির অপরিবর্তনীয়তা সম্পর্কে সতর্ক থাকুন।

এটি বস্তুর একটি অ্যারে গ্রহণ করতে পারে তাই এটি আপনার ক্ষেত্রে কাজ করবে। আমার আগের অভিজ্ঞতায় আমি একটি স্ট্যাকের সাথে যোগ দেওয়ার চেষ্টা করেছি যা একটি পুনরাবৃত্তিযোগ্য এবং এটি দুর্দান্ত কাজ করে।

আমার কাছ থেকে নমুনা:

Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");

প্রিন্ট আউট: |i am a coder|


9

প্রদত্ত:

String[] a = new String[] { "Hello", "World", "!" };

তারপরে কুবার্ডের উত্তরের বিকল্প হিসাবে, আঠালো যেখানে ",":

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

অথবা "& amp;" এর মতো কোনও আলাদা স্ট্রিং দিয়ে সম্মিলিত করতে।

Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")

তবে ... এটি কেবলমাত্র কাজ করে যদি আপনি জানেন যে অ্যারে বা তালিকার মানগুলিতে "," অক্ষর থাকে না contain


Arrays.asList(a).toString()আমি যা করতে চেয়েছিলাম তার জন্য কাজ করেছে
সলোমন উকো


8

মূল না, না। "জাভা অ্যারে জোড় স্ট্রিং আঠালো" এর জন্য অনুসন্ধান আপনাকে কীভাবে এটি অর্জন করতে পারে তার জন্য কিছু কোড স্নিপেট দেবে।

যেমন

public static String join(Collection s, String delimiter) {
    StringBuffer buffer = new StringBuffer();
    Iterator iter = s.iterator();
    while (iter.hasNext()) {
        buffer.append(iter.next());
        if (iter.hasNext()) {
            buffer.append(delimiter);
        }
    }
    return buffer.toString();
}

2
আরও ভাল পারফরম্যান্সের জন্য স্ট্রিংবফার (থ্রেড-সেফ) এর জায়গায় স্ট্রিংবুডার (নন-থ্রেড-সেফ) ব্যবহার করুন। ইন্টারফেস একই।
আসফ

2
এটি snippets.dzone.com/posts/show/91 থেকে মনে হচ্ছে । মন্তব্যগুলি আরও উন্নত সংস্করণটির পরামর্শ দেয়: পাবলিক স্ট্যাটিক স্ট্রিং জয়েন (ইটারেবল <? অবজেক্ট> পিকল, স্ট্রিং বিভাজক) te ইটেটর <? অবজেক্ট> oIter; if (pColl == নাল || (! (oIter = pColl.iterator ()) .হাসনেক্সট ())) ""; স্ট্রিংবিল্ডার ওবিল্ডার = নতুন স্ট্রিংবিল্ডার (স্ট্রিং.ভালিউওফ (oIter.next ())); যখন (oIter.hasNext ()) oBuilder.append (বিভাজক)। অ্যাপেন্ড (oIter.next ()); রিটার্ন oBuilder.toString (); }
কোয়ান্টাম 7

6

যদি আপনি এখানে দ্রুত অ্যারে-থেকে-স্ট্রিং রূপান্তর খুঁজছেন, তবে অ্যারে.টো স্ট্রিং () ব্যবহার করে দেখুন

Object[]পাসের একটি স্ট্রিং প্রতিনিধিত্ব তৈরি করে । ফলাফলটি বন্ধনী দ্বারা ঘিরে রয়েছে ( "[]"), প্রতিটি উপাদান একটি স্ট্রিংয়ে রূপান্তরিত হয় String.valueOf(Object)এবং দ্বারা পৃথক করা হয় ", "। যদি অ্যারে হয় null, তবে "null"ফেরত দেওয়া হবে।


অনেক ধন্যবাদ! স্ট্রিংগুলি "," দ্বারা পৃথক করা হয় এবং পুরো জিনিসটির চারপাশে "[]" থাকে, যা আমার পক্ষে ভাল।
জন হেন্কেল

5

কেবল "আমি সবচেয়ে সংক্ষিপ্ততম একটি" চ্যালেঞ্জের জন্য, এখানে খনিগুলি রয়েছে;)

পুনরাবৃত্ত:

public static String join(String s, Object... a) {
    StringBuilder o = new StringBuilder();
    for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
        o.append(i.next()).append(i.hasNext() ? s : "");
    return o.toString();
}

পুনরাবৃত্তি:

public static String join(String s, Object... a) {
    return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}

2
পুনরাবৃত্তি সংস্করণ মার্জিত। অবশ্যই এটি ব্যবহার করতে যাচ্ছি।
পিট

পুনরাবৃত্ত সংস্করণ মার্জিত হতে পারে তবে বড় অ্যারে (" copyOfRange()") এর জন্য অকার্যকর ।
ওগ্রে গীতসংহিতা 33

4

আমি অন্তর্নির্মিত কিছুই জানি না।

অ্যাপাচি কমন্স ল্যাং এর একটি ক্লাস StringUtilsরয়েছে যার মধ্যে অনেকগুলি যোগদানের ফাংশন রয়েছে।


4

এইভাবেই আমি এটি করি।

private String join(String[] input, String delimiter)
{
    StringBuilder sb = new StringBuilder();
    for(String value : input)
    {
        sb.append(value);
        sb.append(delimiter);
    }
    int length = sb.length();
    if(length > 0)
    {
        // Remove the extra delimiter
        sb.setLength(length - delimiter.length());
    }
    return sb.toString();
}

2

একটি অনুরূপ বিকল্প

/**
 * @param delimiter 
 * @param inStr
 * @return String
 */
public static String join(String delimiter, String... inStr)
{
    StringBuilder sb = new StringBuilder();
    if (inStr.length > 0)
    {
        sb.append(inStr[0]);
        for (int i = 1; i < inStr.length; i++)
        {
            sb.append(delimiter);                   
            sb.append(inStr[i]);
        }
    }
    return sb.toString();
}

2

আমার স্পিন

public static String join(Object[] objects, String delimiter) {
  if (objects.length == 0) {
    return "";
  }
  int capacityGuess = (objects.length * objects[0].toString().length())
      + ((objects.length - 1) * delimiter.length());
  StringBuilder ret = new StringBuilder(capacityGuess);
  ret.append(objects[0]);
  for (int i = 1; i < objects.length; i++) {
    ret.append(delimiter);
    ret.append(objects[i]);
  }
  return ret.toString();
}

public static String join(Object... objects) {
  return join(objects, "");
}

1

আপনি কি কেবল আমার স্ট্রিং ক্লাসের পদ্ধতি ব্যবহার করে আমার 3-লাইনের উপায় পছন্দ করেন?

static String join(String glue, String[] array) {
    String line = "";
    for (String s : array) line += s + glue;
    return (array.length == 0) ? line : line.substring(0, line.length() - glue.length());
}

1
এটি দক্ষ হওয়ার অর্থ নয়। আপনার StringBuilderদক্ষতার প্রয়োজন হলে ব্যবহার করুন : পি
রিওইচিরো ওকা

0

"Str1", "str2", "" থেকে "str1, str2" পেতে:

Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", ")); 

এছাড়াও আপনি অতিরিক্ত নাল-চেক যোগ করতে পারেন


0

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

String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                    ""
            );
}

মনে রাখবেন যে এটি সবচেয়ে দক্ষ পদ্ধতির নয়, তবে এটি ছোট তালিকার পক্ষে ভাল কাজ করে।


-1

আমি স্ট্রিংবিল্ডারটি ব্যবহার করে এটি করি:

public static String join(String[] source, String delimiter) {
    if ((null == source) || (source.length < 1)) {
        return "";
    }

    StringBuilder stringbuilder = new StringBuilder();
    for (String s : source) {
        stringbuilder.append(s + delimiter);
    }
    return stringbuilder.toString();
} // join((String[], String)

1
s + delimiter(প্লাস অপারেটরের সাথে স্ট্রিং কনটেনটেশন) একটি ব্যবহারের পুরো উদ্দেশ্যকে পরাস্ত করে StringBuilder
নীরবতা

এছাড়াও, এই পদ্ধতির অর্থ এই হবে যে একটি অ্যারের মতো: del "foo", "বার"} ডিলিমিটার সহ ":" রূপান্তরিত হবে "foo: বার:"
পিয়োটো

-2

আমি বেশিরভাগ সময় শর্টহ্যান্ড কৌশল ব্যবহার করি ..

String op = new String;
for (int i : is) 
{
    op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);

এটি কেবলমাত্র দৈর্ঘ্য 1 এর সীমানারগুলির সাথে কাজ করে এবং যদি আপনি আলাদা দৈর্ঘ্যের ডিলিমিটার চান তবে 'ম্যাজিক নম্বরগুলি' (যদিও বেশ স্থানীয়) যদিও প্রয়োজন)
maiwald

সংযোজন করার সময় আপনি একাধিক অক্ষর যুক্ত করতে পারেন
গৌরব আদুরকর

এর চেয়ে সহজভাবে করুন: op = op.substring (0, op.length () - ","। দৈর্ঘ্য ()); বড় চুক্তি কি?
ডেনিস

-3

java.util.Arrays এর একটি 'asList' পদ্ধতি রয়েছে। Java.util.List / অ্যারেলিস্ট এপিআইয়ের সাথে একসাথে এটি আপনার যা প্রয়োজন তা দেয় :;

private static String[] join(String[] array1, String[] array2) {

    List<String> list = new ArrayList<String>(Arrays.asList(array1));
    list.addAll(Arrays.asList(array2));
    return list.toArray(new String[0]);
}

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