সি # স্ট্রিং.ফর্ম্যাট () এবং স্ট্রিং.জাইন () এর জাভা সমতুল্য


111

আমি জানি এটি কিছুটা নবাগত প্রশ্ন, তবে জাভাতে সি # এর স্ট্রিং অপারেশনের সমতুল্য কি আছে?

বিশেষত, আমি String.Formatএবং সম্পর্কে কথা বলছি String.Join


সুতরাং এখানে একটি স্ট্রিং.ফর্ম্যাট আছে তবে আমার নিজের যোগদানকে রোল করতে হবে।
ওমর কোহেজি

1
যোগদানের () জন্য, আমি এই উত্তর মত: stackoverflow.com/a/6116469/562139
scorpiodawg

উত্তর:


92

জাভা স্ট্রিং অবজেক্টটির একটি formatপদ্ধতি রয়েছে (২.৫ হিসাবে) তবে নেইjoin পদ্ধতি নেই।

ইতিমধ্যে অন্তর্ভুক্ত না থাকা স্ট্রিং ইউটিলিটি পদ্ধতিগুলির একগুচ্ছ পেতে আপনি org.apache.commons.lang.StringUtils ব্যবহার করতে পারেন ।


13
গুগল সংগ্রহ: গুগল-কালেকশনস.googlecode.com এর একটি জেন্ডারও রয়েছে।
রন

10
রনের মন্তব্যে এফওয়াইআই, গুগল-সংগ্রহগুলি কিছুদিন আগে পেয়ারা নামকরণ করা হয়েছিল।
কেভিন বোউরিলিয়ন

3
জাভা 8 একটি String.join()পদ্ধতি প্রবর্তন করে তা প্রতিবিম্বিত করতে আপনার এই উত্তরটি আপডেট করা উচিত ।
ডানকান জোন্স

46

স্ট্রিং.ফর্ম্যাট । যোগদানের জন্য, আপনার নিজের লিখতে হবে:

 static String join(Collection<?> s, String delimiter) {
     StringBuilder builder = new StringBuilder();
     Iterator<?> iter = s.iterator();
     while (iter.hasNext()) {
         builder.append(iter.next());
         if (!iter.hasNext()) {
           break;                  
         }
         builder.append(delimiter);
     }
     return builder.toString();
 }

উপরেরটি http://snippets.dzone.com/posts/show/91 থেকে আসে


6
আরও সুনির্দিষ্টভাবে: jdk1.4 এর জন্য স্ট্রিংবফার এবং নীচে, jdk1.5 এর জন্য স্ট্রিংবুডার এবং তার পরে, যেহেতু পরেরটিরটি সিঙ্ক্রোনাইজ করা হয়নি, তাই একটু দ্রুত।
ভোনসি

2
দুটি iter.hasNext () অনুরোধগুলির স্থিতি আমি সাধারণত ডেলিমেটার যুক্ত করি এবং তারপরে "buf.substring (0, buf.length () - delimeter.length ())" রিটার্ন করুন।
উইলমন্তাস বড়ানউস্কাস

2
আপনি ডিলিমিটারটি এড়াতে তাড়াতাড়ি প্রস্থান করে এটিকে একটি সামান্য বিভ্রান্ত করতে পারেন: যখন (সত্য) (add_iter; যদি (! Iter.hasNext ()) বিরতি; add_delim;}
13ren


29

জাভা 8 হিসাবে, join() হিসাবে এখন স্ট্রিং ক্লাসে দুটি শ্রেণির পদ্ধতি হিসাবে উপলব্ধ। উভয় ক্ষেত্রে প্রথম যুক্তি হ'ল সীমানা।

আপনি অতিরিক্ত যুক্তি হিসাবে স্বতন্ত্র ব্যক্তিকে পাসCharSequence করতে পারেন :

String joined = String.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium");
// "Antimony, Arsenic, Alumninum, Selenium"

অথবা আপনি একটি পাসIterable<? extends CharSequence> করতে পারেন :

List<String> strings = new LinkedList<String>();
strings.add("EX");
strings.add("TER");
strings.add("MIN");
strings.add("ATE");

String joined = String.join("-", strings);
// "EX-TER-MIN-ATE"

জাভা 8 এছাড়াও একটি নতুন ক্লাস যুক্ত করেছে StringJoiner, যা আপনি এটির মতো ব্যবহার করতে পারেন:

StringJoiner joiner = new StringJoiner("&");
joiner.add("x=9");
joiner.add("y=5667.7");
joiner.add("z=-33.0");

String joined = joiner.toString();
// "x=9&y=5667.7&z=-33.0"


12

আপনি স্ট্রিংয়ের জন্য নিম্নরূপ পরিবর্তনশীল আর্গুমেন্টগুলিও ব্যবহার করতে পারেন:

  String join (String delim, String ... data) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < data.length; i++) {
      sb.append(data[i]);
      if (i >= data.length-1) {break;}
      sb.append(delim);
    }
    return sb.toString();
  }

4

যোগদান হিসাবে, আমি বিশ্বাস করি এটি কিছুটা কম জটিল দেখায়:

public String join (Collection<String> c) {
    StringBuilder sb=new StringBuilder();
    for(String s: c)
        sb.append(s);
    return sb.toString();
}

আমি যতটা চাই জাভা 5 সিনট্যাক্সটি ব্যবহার করব না (বিশ্বাস করুন বা না করুন, আমি ইদানীং 1.0.x ব্যবহার করেছি) সুতরাং আমি কিছুটা মরিচা হতে পারি তবে আমি নিশ্চিত ধারণাটি সঠিক ।

সংযোজন সংযোজন: স্ট্রিং সংযোজনগুলি ধীর হতে পারে তবে আপনি যদি জিইউআই কোড বা কিছু স্বল্প-চলমান রুটিনে কাজ করে থাকেন তবে আপনি .005 সেকেন্ড বা .006 নেন কিনা তা আসলেই কিছু যায় আসে না, তাই যদি আপনার "joinMe" নামে একটি সংগ্রহ থাকে আপনি যে কোনও বিদ্যমান স্ট্রিং "টার্গেট" এ যুক্ত করতে চান তা কেবল এটির ইনলাইন করা ভয়াবহ হবে না:

for(String s : joinMe)
    target += s;

এটি বেশ অদক্ষ (এবং একটি খারাপ অভ্যাস), তবে হাজার হাজার স্ট্রিং না থাকলে বা এটি একটি বিশাল লুপের অভ্যন্তরে না থাকে বা আপনার কোডটি কার্য সম্পাদন সমালোচনামূলক না হলে আপনি বুঝতে সক্ষম হবেন না।

আরও গুরুত্বপূর্ণ বিষয়, এটি মনে রাখা সহজ, সংক্ষিপ্ত, দ্রুত এবং খুব পাঠযোগ্য। পারফরম্যান্স সবসময় ডিজাইনের পছন্দগুলিতে স্বয়ংক্রিয় বিজয়ী হয় না।


লুপটি সঠিক, তবে আপনার এটি সংগ্রহ <স্ট্রিং> করাও উচিত। যদি আপনি এটি না করেন তবে আপনাকে "জন্য (অবজেক্ট ও: সি)" বলতে হবে, কারণ আপনি গ্যারান্টি দিতে পারবেন না যে সি এর সবকিছুই একটি স্ট্রিং ছিল।
মাইকেল মায়ার্স

ভাল কথা, আমি জেনেরিক্সের সাথে আরও বেশি মরিচা। আমি এটিকে সম্পাদনা করব
বিল কে

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

@ স্পেন্সার কে: এটি স্ট্রিংবিল্ডার ব্যবহার করে তবে প্রতিটি পুনরাবৃত্তির জন্য এটি একটি নতুন তৈরি করে (সম্ভবত সবচেয়ে কার্যকর পদ্ধতি, তবে তারপরে সংকলকটি কীভাবে জানা উচিত?)। আমি জানি না জেআইটি সংকলক রানটাইমের সময় এটি অপ্টিমাইজ করতে পারে কিনা।
মাইকেল

2
অপেক্ষা কর. আপনি কি কথা বলছেন + =? হ্যাঁ, যে স্তন্যপান। আমার উত্তরে বর্তমানে লুপ এবং সংযোজন স্ট্রিংবিল্ডার ব্যবহার করে এবং আমি এটিই বলছি। যদিও + = অনেক উন্নতি হয়েছে আপনি এটিকে কোনও লুপের অভ্যন্তরে ব্যবহার করতে চান না - এটি এতটা বগি নয় তবে এটি ক্রেপের মতো সঞ্চালন করতে পারে (বাগ কোনও শব্দ পারফর্মেন্স ইস্যুতে ব্যবহৃত হয় না - কমপক্ষে না আমার 20 বছরের প্রোগ্রামিংয়ে)। এছাড়াও জেআইটি এটির ব্যাপক উন্নতি করতে পারে - তবে আমি তার উপর নির্ভর করব না।
বিল কে

4

এখানে একটি খুব সহজ উত্তর। +=এটি কম কোড হওয়ায় ব্যবহার করুন এবং অপ্টিমাইজারটি এটি আপনার জন্য একটিতে রূপান্তর StringBuilderকরতে দিন। এই পদ্ধতিটি ব্যবহার করে, আপনার লুপের (পারফরম্যান্স উন্নতি) কোনও "শেষ" পরীক্ষা করার দরকার নেই এবং আপনাকে শেষে কোনও ডিলিমিটারগুলি কেড়ে নেওয়ার বিষয়ে চিন্তা করতে হবে না।

        Iterator<String> iter = args.iterator();
        output += iter.hasNext() ? iter.next() : "";
        while (iter.hasNext()) {
            output += "," + iter.next();
        }

1
খুব মার্জিত সমাধান, তৃতীয় পক্ষের লাইব্রেরি জড়িত নয়!
ডেনিস ইটস্কোভিচ

2

আমি একটি সাধারণ যোগদানের ফাংশন যোগ করতে একটি সম্পূর্ণ অ্যাপাচি পাঠাগারটি আমদানি করতে চাইনি, তাই আমার হ্যাকটি এখানে।

    public String join(String delim, List<String> destinations) {
        StringBuilder sb = new StringBuilder();
        int delimLength = delim.length();

        for (String s: destinations) {
            sb.append(s);
            sb.append(delim);
        }

        // we have appended the delimiter to the end 
        // in the previous for-loop. Let's now remove it.
        if (sb.length() >= delimLength) {
            return sb.substring(0, sb.length() - delimLength);
        } else {
            return sb.toString();
        }
    }

@ মিঃস্নোফ্লেক স্ট্যান্ডার্ড স্ট্রিং বিল্ডারের কি কোনও পদ্ধতি আছে "অপসারণচর্ট (ইনটেক্স ইনডেক্স)" এটি চলমান সংস্করণে প্রদর্শিত হচ্ছে না
এনএসজোনাস

@ এনজোনাস - হ্যাঁ আমার উত্তরে তাঁর সম্পাদনা ভুল। removeCharAtবিদ্যমান নয়, এবং সমগ্র ফাংশন আর স্ট্রিং ফেরৎ ... এই ঠিক করবে।
মার্টিন কনেকেনি

আপনার যখন এটি ... এটির বর্তমান সমাধানটি "যদি আপনি একটি খালি তালিকায় পাস করেন তবে সীমা
ছাড় ব্যতীত সূচককে

ডিলিমটি যদি 1 টির বেশি অক্ষর হয় তবে ডান দৈর্ঘ্য ছাঁটাতে একটি সম্পাদনা করেছেন। আপনি এমন একটি
সমস্যাও

মতামত জন্য Thx। আপডেট করা হয়েছে।
মার্টিন কোনেকেনি

1

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

for(String s : joinMe)
    target += s;

স্ট্রিংবুফারের উপর সামান্য পারফরম্যান্সের জয়ও রয়েছে, যেহেতু স্ট্রিংবুডার সিঙ্ক্রোনাইজেশন ব্যবহার করে না।

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

আমাদের পুনরায় ব্যবহারযোগ্য সংগ্রহ -> স্ট্রিং পদ্ধতি প্রথমে প্রয়োজনীয় ফলাফলের আকার গণনা করে এবং তারপরে সেই প্রাথমিক আকারের সাথে একটি স্ট্রিংবিল্ডার তৈরি করে; এটি স্ট্রিং সংযোজন করার সময় ব্যবহৃত অভ্যন্তরীণ চর [] এর অনাকাঙ্ক্ষিত দ্বিগুণ / অনুলিপি এড়ানো যায়।


পুনরায়: প্রাক-গণনা আকার: যখন এটি কাজ করে, দুর্দান্ত। এটা সবসময় সম্ভব হয় না। আমি কোথাও পড়ার কথা স্মরণ করছি যে প্রতিবার বাফারের আকার দ্বিগুণ করা (বা কোনও নির্দিষ্ট ফ্যাক্টর দ্বারা সত্যই গুণ করা) এন লগ এন পারফরম্যান্সের মতো কিছু দেয় যা আসলে খুব খারাপ নয়। সাধারণ ক্ষেত্রে, বিকল্পটি হ'ল আপনি যে সমস্ত স্ট্রিংটি একত্রিত করতে চান তার একটি তালিকা তৈরি করা। আপনি যদি একটি অ্যারেলিস্ট ব্যবহার করেন, আপনি আবার অনুলিপি পেয়েছেন (যদি না আপনি নিজের ক্রমের দৈর্ঘ্য আগাম জানেন না) এবং আপনি যদি লিংকডলিস্ট ব্যবহার করেন, তবে এটি নোড অবজেক্টগুলির সাথে আরও মেষ এবং আবর্জনা সংগ্রহ ব্যবহার করে। কখনও কখনও আপনি জিততে পারবেন না। চেষ্টা করুন!
আয়ান

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

1

আমি নিজস্ব লিখেছি:

public static String join(Collection<String> col, String delim) {
    StringBuilder sb = new StringBuilder();
    Iterator<String> iter = col.iterator();
    if (iter.hasNext())
        sb.append(iter.next().toString());
    while (iter.hasNext()) {
        sb.append(delim);
        sb.append(iter.next().toString());
    }
    return sb.toString();
}

তবে Collectionজেএসপি সমর্থিত নয়, তাই ট্যাগ ফাংশনের জন্য আমি লিখেছিলাম:

public static String join(List<?> list, String delim) {
    int len = list.size();
    if (len == 0)
        return "";
    StringBuilder sb = new StringBuilder(list.get(0).toString());
    for (int i = 1; i < len; i++) {
        sb.append(delim);
        sb.append(list.get(i).toString());
    }
    return sb.toString();
}

এবং .tldফাইল করা:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    <function>
        <name>join</name>
        <function-class>com.core.util.ReportUtil</function-class>
        <function-signature>java.lang.String join(java.util.List, java.lang.String)</function-signature>
    </function>
</taglib>

এবং এটি জেএসপি ফাইলগুলিতে ব্যবহার করুন:

<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}

0

স্ট্রিংউটিলস অ্যাপাচি কমন্স ল্যাং লাইব্রেরিতে একটি বেশ দরকারী বর্গ।


8
সম্ভবত আপনি খেয়াল করেন নি যে 8 মাস আগে পোস্ট করা স্বীকৃত উত্তরটিতে ইতিমধ্যে একই তথ্য রয়েছে; stackoverflow.com/questions/187676/string-operations-in-java/...
Jonik


0

আমি এখানে স্ট্রিং.জয়িনের অত্যধিক জটিল বাস্তবায়ন দেখতে পাই। আপনার যদি জাভা 1.8 না থাকে এবং আপনি কোনও নতুন লাইব্রেরি আমদানি করতে চান না তবে নীচের প্রয়োগটি যথেষ্ট should

public String join(Collection<String> col, String delim) {
    StringBuilder sb = new StringBuilder();
    for ( String s : col ) {
        if ( sb.length() != 0 ) sb.append(delim);
        sb.append(s);
    }
    return sb.toString();
}

-1
ArrayList<Double> j=new ArrayList<>; 
j.add(1);
j.add(.92);
j.add(3); 
String ntop=j.toString(); //ntop= "[1, 0.92, 3]" 

সুতরাং মূলত, স্ট্রিং এনটপ কমা বিভাজক এবং বন্ধনী সহ পুরো সংগ্রহের মান সঞ্চয় করে।


1
আমি নিশ্চিত না যে প্রশ্নের উত্তরটি এর কোন অংশের? এটি স্ট্রিং.ফর্ম্যাট না হলে আপনি স্ট্রিং বিটের বিটগুলিকে অ্যারেতে বিট করে যোগ করার পরিকল্পনা না করেন এবং [১,০.৯২,৩] জেনেরিক স্ট্রিংয়ের মতো বহুমুখী নয় j
ওমর কোহেজি

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