জাভাতে সীমাবদ্ধ আইটেমগুলির স্ট্রিং তৈরির সেরা উপায় কী?


317

জাভা অ্যাপ্লিকেশনটিতে কাজ করার সময়, আমার কাছে কয়টি উপাদান আগে থেকে থাকবে তা না জেনে অন্য ওয়েব পরিষেবাদিতে পাস করার জন্য কমা-সীমাবদ্ধ মানগুলির তালিকা সংগ্রহ করতে হয়েছিল। আমার মাথার উপরের অংশটি দিয়ে আমি যে সেরাটি আসতে পারলাম তা হ'ল:

public String appendWithDelimiter( String original, String addition, String delimiter ) {
    if ( original.equals( "" ) ) {
        return addition;
    } else {
        return original + delimiter + addition;
    }
}

String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );

আমি বুঝতে পারি এটি বিশেষভাবে দক্ষ নয়, যেহেতু স্থান জুড়ে স্ট্রিং তৈরি হচ্ছে, তবে আমি অপ্টিমাইজেশনের চেয়ে আরও স্পষ্টতার দিকে যাচ্ছিলাম।

রুবিতে, আমি এর পরিবর্তে এর মতো কিছু করতে পারি, যা আরও বেশি মার্জিত মনে হয়:

parameterArray = [];
parameterArray << "elementName" if condition;
parameterArray << "anotherElementName" if anotherCondition;
parameterString = parameterArray.join(",");

তবে যেহেতু জাভাতে একটি জয়েন কমান্ডের অভাব রয়েছে, তাই আমি এর সমতুল্য কিছু বের করতে পারি না।

তো, জাভাতে এটি করার সর্বোত্তম উপায় কী?


স্ট্রিংব বিল্ডারটি যাবার উপায় - java.lang.StringBuilder।
ইউসুভভ

জাভা 8 এর জন্য এই উত্তরটি একবার দেখুন: stackoverflow.com/a/22577623/1115554
মিচা

উত্তর:


542

প্রাক জাভা 8:

অ্যাপাচি এর কমন্স ল্যাং এখানে আপনার বন্ধু - এটি আপনি রুবিতে যেমন উল্লেখ করেন তার সাথে মিলিত হওয়ার একটি যোগ পদ্ধতি প্রদান করে:

StringUtils.join(java.lang.Iterable,char)


জাভা 8:

জাভা 8 মাধ্যমে বাক্সের বাইরে যোগদান প্রদান করে StringJoinerএবং String.join()। নীচের স্নিপেটগুলি দেখায় যে আপনি কীভাবে সেগুলি ব্যবহার করতে পারেন:

StringJoiner

StringJoiner joiner = new StringJoiner(",");
joiner.add("01").add("02").add("03");
String joinedString = joiner.toString(); // "01,02,03"

String.join(CharSequence delimiter, CharSequence... elements))

String joinedString = String.join(" - ", "04", "05", "06"); // "04 - 05 - 06"

String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)

List<String> strings = new LinkedList<>();
strings.add("Java");strings.add("is");
strings.add("cool");
String message = String.join(" ", strings);
//message returned is: "Java is cool"

2
আমি ভাবছি - সংগ্রহের কোনও অবজেক্টের স্ট্রিং উপস্থাপনার মধ্যে ডিলিমিটার চরিত্রটি থাকলে তা কি বিবেচনায় নেবে?
গ্রিনিমিনি

4
ঠিক আমি কী সন্ধান করছিলাম: org.apache.commons.lang3.StringUtils প্যাকেজ থেকে স্ট্রিংটিলস.জয়াইন (java.util. Colલેક્શન, স্ট্রিং), জার ফাইলটি কমন্স-lang3-3.0.1.jar
উমর

108
অ্যান্ড্রয়েডে আপনি TextUtils.join ()ও ব্যবহার করতে পারেন।
জেমস ওয়াল্ড

3
এটি সেরা উপায় নয়। সংগ্রহের অবজেক্টটি নাল / ফাঁকা থাকলেও এটি সর্বদা চর যোগ করবে। এটি সুন্দর এবং পরিষ্কার তবে কখনও কখনও এটি একটি ডাবল ডিলিমিটার চর মুদ্রণ করবে।
স্টিফান শ্যায়েলকে

52

আপনি java.util.Lists- এ কাজ করে এমন একটি সামান্য যোগ-শৈলীর ইউটিলিটি পদ্ধতি লিখতে পারেন

public static String join(List<String> list, String delim) {

    StringBuilder sb = new StringBuilder();

    String loopDelim = "";

    for(String s : list) {

        sb.append(loopDelim);
        sb.append(s);            

        loopDelim = delim;
    }

    return sb.toString();
}

তারপরে এটির মতো ব্যবহার করুন:

    List<String> list = new ArrayList<String>();

    if( condition )        list.add("elementName");
    if( anotherCondition ) list.add("anotherElementName");

    join(list, ",");

2
কমপক্ষে 2 টি প্রয়োগ (অ্যাপাচি এবং পেয়ারা) ইতিমধ্যে বিদ্যমান থাকলে আপনার নিজের পদ্ধতিটি কেন লিখবেন?
টিমোফাই

29
এটি, যেমন, দরকারী হতে পারে যদি কারও কম বাহ্যিক নির্ভরতা থাকতে চায় useful
টমাস জুমব্রুন

2
আমি কন্ডিশনের পরিবর্তে লুপডেলিম কীভাবে ব্যবহৃত হয় তা পছন্দ করি। এটি হ্যাক ধরনের, কিন্তু এটি একটি চক্র থেকে শর্তাধীন বিবৃতি সরিয়ে দেয়। আমি এখনও পুনরুক্তি ব্যবহার করে চক্রের আগে প্রথম উপাদান যুক্ত করতে পছন্দ করি তবে এটি একটি দুর্দান্ত হ্যাক।
ভ্লাস্যাক

আপনি কি নিজের List<String>ইন্টিটিয়ালাইজারে পরিবর্তন করতে পারবেন না Iterator<?>এবং একই প্রভাব ফেলতে পারবেন?
কে_জি

@ টিম এগ অ্যাপাচি খালি স্ট্রিং এড়ায় না।
banterCZ


31

Google এর পেয়ারা গ্রন্থাগার রয়েছে com.google.common.base.Joiner বর্গ যা কর্ম সমাধান করতে সাহায্য করে।

নমুনা:

"My pets are: " + Joiner.on(", ").join(Arrays.asList("rabbit", "parrot", "dog")); 
// returns "My pets are: rabbit, parrot, dog"

Joiner.on(" AND ").join(Arrays.asList("field1=1" , "field2=2", "field3=3"));
// returns "field1=1 AND field2=2 AND field3=3"

Joiner.on(",").skipNulls().join(Arrays.asList("London", "Moscow", null, "New York", null, "Paris"));
// returns "London,Moscow,New York,Paris"

Joiner.on(", ").useForNull("Team held a draw").join(Arrays.asList("FC Barcelona", "FC Bayern", null, null, "Chelsea FC", "AC Milan"));
// returns "FC Barcelona, FC Bayern, Team held a draw, Team held a draw, Chelsea FC, AC Milan"

এখানে পেয়ারার স্ট্রিং ইউটিলিটিগুলি সম্পর্কে একটি নিবন্ধ দেওয়া আছে


26

জাভা 8 এ আপনি ব্যবহার করতে পারেন String.join():

List<String> list = Arrays.asList("foo", "bar", "baz");
String joined = String.join(" and ", list); // "foo and bar and baz"

স্ট্রিম এপিআই উদাহরণের জন্য এই উত্তরটি দেখুন ।


20

আপনি এটিকে সাধারণীকরণ করতে পারেন, তবে জাভাতে কোনও যোগ নেই, যেমনটি আপনি ভালই বলেছেন।

এটি আরও ভাল কাজ করতে পারে।

public static String join(Iterable<? extends CharSequence> s, String delimiter) {
    Iterator<? extends CharSequence> iter = s.iterator();
    if (!iter.hasNext()) return "";
    StringBuilder buffer = new StringBuilder(iter.next());
    while (iter.hasNext()) buffer.append(delimiter).append(iter.next());
    return buffer.toString();
}

আমি এই উত্তরের সাথে একমত হই তবে কেউ কি স্বাক্ষরটি সম্পাদন করতে পারে যাতে এটি বিমূর্ত সংগ্রহের পরিবর্তে <স্ট্রিং> <স্ট্রিং> গ্রহণ করে? কোডের বাকি অংশটি একই হওয়া উচিত তবে আমি মনে করি অ্যাবস্ট্রাক্টক্লিকেশনটি একটি বাস্তবায়ন বিশদ যা এখানে গুরুত্বপূর্ণ নয়।
আউটলা প্রোগ্রামার

আরও ভাল, ব্যবহার করুন Iterable<String>এবং কেবলমাত্র এটির উপরে পুনরাবৃত্তি করতে পারবেন তা ব্যবহার করুন। আপনার উদাহরণে আপনার সংগ্রহে আইটেমের সংখ্যা প্রয়োজন নেই, সুতরাং এটি আরও সাধারণ।
জেসন কোহেন

1
বা আরও ভাল, ব্যবহারযোগ্য <? চরসেক্সেন্স> প্রসারিত করে এবং তারপরে আপনি স্ট্রিংবিল্ডারস এবং স্ট্রিংস এবং স্ট্রিম এবং অন্যান্য স্ট্রিং-জাতীয় জিনিসের সংগ্রহ গ্রহণ করতে পারেন। :)
জেসন কোহেন

2
StringBuilderপরিবর্তে আপনি একটি ব্যবহার করতে চান । StringBufferঅপ্রয়োজনীয় থ্রেড সুরক্ষা ব্যতীত এগুলি অভিন্ন । কেউ দয়া করে এটি সম্পাদনা করতে পারেন!
কেসব্যাশ

1
এই কোডটিতে বেশ কয়েকটি ত্রুটি রয়েছে। 1. চরসেকেন্সের একটি মূলধন রয়েছে। 2. s.iterator () একজন আইট্রেটারকে <? CharSequence> প্রসারিত করে। ৩.এল্টেবলের কোনও isEmpty()পদ্ধতি নেই, next()পরিবর্তে পদ্ধতিটি ব্যবহার করুন
কেসব্যাশ

17

জাভা 8 এ আপনি এটি করতে পারেন:

list.stream().map(Object::toString)
        .collect(Collectors.joining(delimiter));

যদি তালিকার শূন্য থাকে তবে আপনি ব্যবহার করতে পারেন:

list.stream().map(String::valueOf)
        .collect(Collectors.joining(delimiter))

এটি উপসর্গ এবং প্রত্যয়কে সমর্থন করে:

list.stream().map(String::valueOf)
        .collect(Collectors.joining(delimiter, prefix, suffix));

15

উপর ভিত্তি করে একটি পদ্ধতির ব্যবহার করুন java.lang.StringBuilder ! ("অক্ষরের একটি পরিবর্তনীয় ক্রম।")

যেমন আপনি উল্লেখ করেছেন, এই সমস্ত স্ট্রিং কনটেন্টেশনগুলি পুরোপুরি স্ট্রিংগুলি তৈরি করছে। StringBuilderএটা করবে না।

এর StringBuilderবদলে কেন StringBuffer? StringBuilderজাভাডোক থেকে :

যেখানে সম্ভব, এটি সুপারিশ করা হয় যে এই শ্রেণিটি স্ট্রিংবাফারকে অগ্রাধিকার হিসাবে ব্যবহার করা উচিত কারণ এটি বেশিরভাগ বাস্তবায়নের অধীনে দ্রুততর হবে।


4
হাঁ। এছাড়াও, স্ট্রিংবুফার থ্রেড-নিরাপদ, অন্যদিকে স্ট্রিংবুডার নেই।
জন অনস্টট

10

আমি গুগল কালেকশন ব্যবহার করব। একটি দুর্দান্ত যোগদানের সুবিধা রয়েছে।
http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/base/Join.html

তবে আমি যদি নিজে থেকে এটি লিখতে চাইতাম,

package util;

import java.util.ArrayList;
import java.util.Iterable;
import java.util.Collections;
import java.util.Iterator;

public class Utils {
    // accept a collection of objects, since all objects have toString()
    public static String join(String delimiter, Iterable<? extends Object> objs) {
        if (objs.isEmpty()) {
            return "";
        }
        Iterator<? extends Object> iter = objs.iterator();
        StringBuilder buffer = new StringBuilder();
        buffer.append(iter.next());
        while (iter.hasNext()) {
            buffer.append(delimiter).append(iter.next());
        }
        return buffer.toString();
    }

    // for convenience
    public static String join(String delimiter, Object... objs) {
        ArrayList<Object> list = new ArrayList<Object>();
        Collections.addAll(list, objs);
        return join(delimiter, list);
    }
}

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




3

আপনি StringBuilderএই জন্য জাভা টাইপ ব্যবহার করতে পারেন । এছাড়াও StringBufferরয়েছে, তবে এটিতে অতিরিক্ত থ্রেড সুরক্ষা যুক্তি রয়েছে যা প্রায়শই অপ্রয়োজনীয়।


3

এবং একটি ন্যূনতম একটি (যদি আপনি কেবল স্ট্রিংগুলিতে যোগদানের জন্য অ্যাপাচি কমন্স বা গাভাকে প্রকল্প নির্ভরতার সাথে অন্তর্ভুক্ত করতে না চান)

/**
 *
 * @param delim : String that should be kept in between the parts
 * @param parts : parts that needs to be joined
 * @return  a String that's formed by joining the parts
 */
private static final String join(String delim, String... parts) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < parts.length - 1; i++) {
        builder.append(parts[i]).append(delim);
    }
    if(parts.length > 0){
        builder.append(parts[parts.length - 1]);
    }
    return builder.toString();
}

ফাইল.সেসপেটরের পরিবর্তে ডিলিম ব্যবহার করুন।
প্রদীপ কুমার

3

স্ট্রিংবিল্ডার এবং ক্লাস ব্যবহার করুন Separator

StringBuilder buf = new StringBuilder();
Separator sep = new Separator(", ");
for (String each : list) {
    buf.append(sep).append(each);
}

বিভাজক একটি সীমানা আবৃত। ডিলিমিটারটি সেপরেটার দ্বারা ফিরিয়ে দেওয়া হয়toStringপ্রথম কলটিতে খালি স্ট্রিংটি না পদ্ধতিতে আসে!

শ্রেণীর জন্য উত্স কোড Separator

public class Separator {

    private boolean skipFirst;
    private final String value;

    public Separator() {
        this(", ");
    }

    public Separator(String value) {
        this.value = value;
        this.skipFirst = true;
    }

    public void reset() {
        skipFirst = true;
    }

    public String toString() {
        String sep = skipFirst ? "" : value;
        skipFirst = false;
        return sep;
    }

}

সংশোধন সম্পর্কে কী Separatorতাই এটি StringBuilderযুক্তিযুক্ত পরিবর্তে একটি ব্যবহার করে Strings?
মোহাম্মদ নুরুর

@ মোহাম্মদ Separatorসবেমাত্র ডিলিমিটার ফিরিয়ে দেয়, এটি স্ট্রিংটি নিজেই একত্রিত করে না।
akuhn

এই শ্রেণি কি Separator??? শুধু সরল স্ট্রিং ব্যবহার করবেন না কেন ..!?
ম্যাক্সিম্সিয়াম

2

আপনার নিজের যোগদান () পদ্ধতিটি লিখছেন না কেন? এটি স্ট্রিংস এবং একটি ডিলিমিটার স্ট্রিংয়ের প্যারামিটার সংগ্রহ হিসাবে গ্রহণ করবে। পদ্ধতির মধ্যে সংগ্রহটি পুনরাবৃত্তি করুন এবং স্ট্রিংবফারে আপনার ফলাফলটি তৈরি করুন।


2

আপনি যদি স্প্রিং এমভিসি ব্যবহার করেন তবে আপনি নিম্নলিখিত পদক্ষেপগুলি চেষ্টা করতে পারেন।

import org.springframework.util.StringUtils;

List<String> groupIds = new List<String>;   
groupIds.add("a");    
groupIds.add("b");    
groupIds.add("c");

String csv = StringUtils.arrayToCommaDelimitedString(groupIds.toArray());

এটি ফলাফল হবে a,b,c


2

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

makeString()একটি ফেরৎ Stringউপস্থাপনা, অনুরূপ toString()

এর তিনটি রূপ রয়েছে

  • makeString(start, separator, end)
  • makeString(separator) ডিফল্টগুলি খালি স্ট্রিংয়ের শুরু এবং শেষ হয়
  • makeString()পৃথককে ডিফল্ট করে ", "(কমা এবং স্থান)

কোড উদাহরণ:

MutableList<Integer> list = FastList.newListWith(1, 2, 3);
assertEquals("[1/2/3]", list.makeString("[", "/", "]"));
assertEquals("1/2/3", list.makeString("/"));
assertEquals("1, 2, 3", list.makeString());
assertEquals(list.toString(), list.makeString("[", ", ", "]"));

appendString()অনুরূপ makeString(), তবে এটি একটি Appendable(লাইক StringBuilder) এর সাথে সংযোজন করে এবং হয়void । এটি অতিরিক্ত তিনটি যুক্তি, অ্যাপেন্ডেবল সহ একই তিনটি ফর্ম রয়েছে।

MutableList<Integer> list = FastList.newListWith(1, 2, 3);
Appendable appendable = new StringBuilder();
list.appendString(appendable, "[", "/", "]");
assertEquals("[1/2/3]", appendable.toString());

আপনি যদি নিজের সংগ্রহটিকে একটি Elpipse সংগ্রহের ধরণে রূপান্তর করতে না পারেন, তবে কেবল এটি প্রাসঙ্গিক অ্যাডাপ্টারের সাথে মানিয়ে নিন।

List<Object> list = ...;
ListAdapter.adapt(list).makeString(",");

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


2

জাভা 8 নেটিভ টাইপ

List<Integer> example;
example.add(1);
example.add(2);
example.add(3);
...
example.stream().collect(Collectors.joining(","));

জাভা 8 কাস্টম অবজেক্ট:

List<Person> person;
...
person.stream().map(Person::getAge).collect(Collectors.joining(","));

1

আপনার ফলাফলটি তৈরি করার জন্য আপনার সম্ভবত পদ্ধতিটির StringBuilderসাথে ব্যবহার করা উচিত append, তবে অন্যথায় এটি জাভা যেমন প্রস্তাবিত হয় তেমন একটি সমাধান হিসাবে কার্যকর।


1

আপনি জাবাতে একইভাবে রুবিতে করছেন না কেন, আপনি অ্যারের সাথে সমস্ত টুকরা যুক্ত করার পরেই সীমানা পৃথক স্ট্রিং তৈরি করছে?

ArrayList<String> parms = new ArrayList<String>();
if (someCondition) parms.add("someString");
if (anotherCondition) parms.add("someOtherString");
// ...
String sep = ""; StringBuffer b = new StringBuffer();
for (String p: parms) {
    b.append(sep);
    b.append(p);
    sep = "yourDelimiter";
}

আপনি লুপের জন্য পৃথক সহায়ক পদ্ধতিতে স্থানান্তর করতে চাইতে পারেন এবং স্ট্রিংবুফারের পরিবর্তে স্ট্রিংবুডার ব্যবহার করতে পারেন ...

সম্পাদনা : সংযোজনগুলির ক্রম স্থির করে।


হ্যাঁ, আপনি স্ট্রিংবুডারের পরিবর্তে স্ট্রিংবুফার ব্যবহার করবেন কেন (আপনি জাভা 1.5+ ব্যবহার করছেন)? আপনার চারপাশে ভুল সংযোজন রয়েছে।
টম হাটিন -

1

জাভা 5 ভেরিয়েবল আরোগুলির সাহায্যে আপনার সমস্ত স্ট্রিং কোনও সংগ্রহ বা অ্যারেতে স্পষ্টভাবে স্টাফ করতে হবে না:

import junit.framework.Assert;
import org.junit.Test;

public class StringUtil
{
    public static String join(String delim, String... strings)
    {
        StringBuilder builder = new StringBuilder();

        if (strings != null)
        {
            for (String str : strings)
            {
                if (builder.length() > 0)
                {
                    builder.append(delim).append(" ");
                }
                builder.append(str);
            }
        }           
        return builder.toString();
    }
    @Test
    public void joinTest()
    {
        Assert.assertEquals("", StringUtil.join(",", null));
        Assert.assertEquals("", StringUtil.join(",", ""));
        Assert.assertEquals("", StringUtil.join(",", new String[0]));
        Assert.assertEquals("test", StringUtil.join(",", "test"));
        Assert.assertEquals("foo, bar", StringUtil.join(",", "foo", "bar"));
        Assert.assertEquals("foo, bar, x", StringUtil.join(",", "foo", "bar", "x"));
    }
}

1

যারা বসন্তের প্রসঙ্গে আছেন তাদের স্ট্রিংটিলগুলি শ্রেণিটিও দরকারী:

এখানে অনেকগুলি দরকারী শর্টকাট রয়েছে:

  • সংগ্রহটোকাডিমিলিট স্ট্রিং (সংগ্রহ সংঘর্ষ)
  • সংগ্রহটিডিলিমিটেড স্ট্রিং (সংগ্রহ সংঘর্ষ, স্ট্রিং ডিলিম)
  • অ্যারেটোডিলিমিটেড স্ট্রিং (অবজেক্ট [] আরআর, স্ট্রিং ডিলিম)

এবং আরও অনেক কিছু.

আপনি যদি ইতিমধ্যে জাভা 8 ব্যবহার না করে থাকেন এবং আপনি ইতিমধ্যে একটি বসন্ত প্রসঙ্গে রয়েছেন তবে এটি সহায়ক হতে পারে।

আমি সংগ্রহের সহায়তার জন্য এটি অ্যাপাচি কমন্স (যদিও খুব ভাল ভাল) এর বিপরীতে পছন্দ করি যা এর চেয়ে সহজ:

// Encoding Set<String> to String delimited 
String asString = org.springframework.util.StringUtils.collectionToDelimitedString(codes, ";");

// Decoding String delimited to Set
Set<String> collection = org.springframework.util.StringUtils.commaDelimitedListToSet(asString);

0

আপনি এরকম কিছু চেষ্টা করতে পারেন:

StringBuilder sb = new StringBuilder();
if (condition) { sb.append("elementName").append(","); }
if (anotherCondition) { sb.append("anotherElementName").append(","); }
String parameterString = sb.toString();

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

0

সুতরাং মূলত এরকম কিছু:

public static String appendWithDelimiter(String original, String addition, String delimiter) {

if (original.equals("")) {
    return addition;
} else {
    StringBuilder sb = new StringBuilder(original.length() + addition.length() + delimiter.length());
        sb.append(original);
        sb.append(delimiter);
        sb.append(addition);
        return sb.toString();
    }
}

এখানে সমস্যাটি হ'ল তিনি মনে করেন যে তিনি অ্যাপেন্ডডওলিমিটার () বরাদ্দ দিয়ে কল করছেন। সমাধানের ক্ষেত্রে উদাহরণস্বরূপ কেবলমাত্র একটি এবং একটি স্ট্রিংবুফার হওয়া উচিত এবং সেই একক দৃষ্টান্তের সাথে কাজ করা উচিত।
স্টু থম্পসন

0

এটি সত্যিই আরও ভাল কিনা তা আপনি জানেন না তবে কমপক্ষে এটি স্ট্রিংবিল্ডার ব্যবহার করছেন যা কিছুটা দক্ষ হতে পারে।

আপনি যদি কোনও প্যারামিটার সীমানা নির্ধারণ করার আগে প্যারামিটারগুলির তালিকা তৈরি করতে পারেন তবে নীচে নীচে আরও জেনেরিক পন্থা।

// Answers real question
public String appendWithDelimiters(String delimiter, String original, String addition) {
    StringBuilder sb = new StringBuilder(original);
    if(sb.length()!=0) {
        sb.append(delimiter).append(addition);
    } else {
        sb.append(addition);
    }
    return sb.toString();
}


// A more generic case.
// ... means a list of indeterminate length of Strings.
public String appendWithDelimitersGeneric(String delimiter, String... strings) {
    StringBuilder sb = new StringBuilder();
    for (String string : strings) {
        if(sb.length()!=0) {
            sb.append(delimiter).append(string);
        } else {
            sb.append(string);
        }
    }

    return sb.toString();
}

public void testAppendWithDelimiters() {
    String string = appendWithDelimitersGeneric(",", "string1", "string2", "string3");
}

0

আপনার পদ্ধতিটি খুব খারাপ নয়, তবে আপনার + চিহ্নটি ব্যবহার না করে স্ট্রিংবফার ব্যবহার করা উচিত। + এর মধ্যে বড় অসুবিধা রয়েছে যে প্রতিটি একক ক্রিয়াকলাপের জন্য একটি নতুন স্ট্রিং দৃষ্টান্ত তৈরি করা হচ্ছে। আপনার স্ট্রিং যত দীর্ঘ হবে তত বড় ওভারহেড। সুতরাং স্ট্রিংবফার ব্যবহার করা দ্রুততম উপায় হওয়া উচিত:

public StringBuffer appendWithDelimiter( StringBuffer original, String addition, String delimiter ) {
        if ( original == null ) {
                StringBuffer buffer = new StringBuffer();
                buffer.append(addition);
                return buffer;
        } else {
                buffer.append(delimiter);
                buffer.append(addition);
                return original;
        }
}

আপনি আপনার স্ট্রিং তৈরি শেষ করার পরে ফিরে আসা স্ট্রিংবফারে সরাসরি স্ট্রিং () কল করুন।


1
এখানে স্ট্রিংবফার ব্যবহার করা কোনও কারণ ছাড়াই এটি ধীর করে দেবে। অভ্যন্তরীণভাবে + অপারেটরটি ব্যবহার করে অভ্যন্তরীণভাবে দ্রুত স্ট্রিংবিল্ডার ব্যবহার করা হবে যাতে তার পরিবর্তে স্ট্রিংবফার ব্যবহার করে থ্রেড সুরক্ষা ছাড়া তার আর দরকার নেই he
ফ্রেড্রিক

এছাড়াও ... বিবৃতিটি "দ্য + এর বড় অসুবিধা রয়েছে যে প্রতিটি একক ক্রিয়াকলাপের জন্য একটি নতুন স্ট্রিং উদাহরণ তৈরি করা হচ্ছে" মিথ্যা false সংকলক স্ট্রিংবিল্ডার.অ্যাপেন্ড () এর মধ্যে কল উত্পন্ন করবে।
ফ্রেড্রিক

0

স্ট্রিং কনটেনটেশন ব্যবহারের পরিবর্তে, আপনার কোডটি থ্রেডযুক্ত না থাকলে আপনার স্ট্রিংবিল্ডার এবং স্ট্রিংবাফারটি ব্যবহার করা উচিত।


0

আপনি এটির তুলনায় এটি আরও জটিল করে তুলছেন। আসুন আপনার উদাহরণের শেষে দিয়ে শুরু করুন:

String parameterString = "";
if ( condition ) parameterString = appendWithDelimiter( parameterString, "elementName", "," );
if ( anotherCondition ) parameterString = appendWithDelimiter( parameterString, "anotherElementName", "," );

স্ট্রিংয়ের পরিবর্তে একটি স্ট্রিংবিল্ডার ব্যবহারের ছোট পরিবর্তন সহ, এটি হয়ে যায়:

StringBuilder parameterString = new StringBuilder();
if (condition) parameterString.append("elementName").append(",");
if (anotherCondition) parameterString.append("anotherElementName").append(",");
...

আপনার হয়ে গেলে (আমি ধরে নিচ্ছি আপনাকে আরও কয়েকটি শর্তও পরীক্ষা করতে হবে), কেবল নিশ্চিত হয়ে নিন যে আপনি এই জাতীয় আদেশ দিয়ে টেলিং কমাটি সরিয়েছেন:

if (parameterString.length() > 0) 
    parameterString.deleteCharAt(parameterString.length() - 1);

এবং অবশেষে, আপনি যে স্ট্রিংটি চান তা পান

parameterString.toString();

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


0
//Note: if you have access to Java5+, 
//use StringBuilder in preference to StringBuffer.  
//All that has to be replaced is the class name.  
//StringBuffer will work in Java 1.4, though.

appendWithDelimiter( StringBuffer buffer, String addition, 
    String delimiter ) {
    if ( buffer.length() == 0) {
        buffer.append(addition);
    } else {
        buffer.append(delimiter);
        buffer.append(addition);
    }
}


StringBuffer parameterBuffer = new StringBuffer();
if ( condition ) { 
    appendWithDelimiter(parameterBuffer, "elementName", "," );
}
if ( anotherCondition ) {
    appendWithDelimiter(parameterBuffer, "anotherElementName", "," );
}

//Finally, to return a string representation, call toString() when returning.
return parameterBuffer.toString(); 

0

সুতরাং এমন কিছু অনুভূতি অর্জনের জন্য আপনি করতে পারেন যা দেখে মনে হয় আপনি খুঁজছেন:

1) তালিকা শ্রেণি প্রসারিত করুন - এবং এতে যোগদানের পদ্ধতি যুক্ত করুন। যোগদানের পদ্ধতিটি কেবল সীমাবদ্ধকরণ এবং ডিলিমিটার যুক্ত করার কাজটি করে (যা যোগদানের পদ্ধতিতে পরম হতে পারে)

2) দেখে মনে হচ্ছে জাভা 7 জাভাতে এক্সটেনশন পদ্ধতি যুক্ত করতে চলেছে - যা আপনাকে কেবল কোনও ক্লাসে একটি নির্দিষ্ট পদ্ধতি সংযুক্ত করার অনুমতি দেয়: যাতে আপনি সেই যোগদানের পদ্ধতিটি লিখতে পারেন এবং এটি তালিকাতে বা এমনকি একটি এক্সটেনশন পদ্ধতি হিসাবে যুক্ত করতে পারেন সংগ্রহ।

সমাধান 1 সম্ভবত একমাত্র বাস্তববাদী, যদিও জাভা 7 এখনও বেরিয়ে নেই :) তবে এটি ঠিক কাজ করা উচিত।

এই দুটি ব্যবহার করার জন্য, আপনি কেবলমাত্র আপনার সমস্ত আইটেমকে যথারীতি তালিকাগুলি বা সংগ্রহের সাথে যুক্ত করতে চান এবং তারপরে নতুন কাস্টম পদ্ধতিতে তাদের 'যোগ দিতে' কল করুন।

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