जावा: PHP के जुड़ने () जैसे सरणियों के लिए कार्य?


259

मैं String[]एक गोंद स्ट्रिंग के साथ जुड़ना चाहता हूं । क्या इसके लिए कोई फ़ंक्शन है?


7
जावा 8 में यह कार्यक्षमता बॉक्स से बाहर शामिल है। मैं @Marek ग्रेगर से जवाब देने के लिए स्क्रॉल करने के लिए पाठक की सलाह देते हैं (और यह वोट दें ..)
Stav

जवाबों:


307

Java8 से शुरू करना संभव है String.join()

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

उत्पन्न करता है:

Hello, World, !

अन्यथा, अपाचे कॉमन्स लैंग में एक StringUtilsवर्ग होता है जिसमें एक joinफ़ंक्शन होता है जो एक बनाने के लिए एक साथ सरणियों में शामिल होगा String

उदाहरण के लिए:

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

निम्नलिखित उत्पन्न करता है String:

Hello, World, !

7
इस उत्तर की खोज करने वाले लोगों के लाभ के लिए, संभवतः यह ध्यान दिया जाना चाहिए कि यह एक पर्ल जॉइन के बराबर भी है।
k-den

3
यह कहता है कि यह मेरे लिए अपरिभाषित है
Ninjaxor

@Ninjaxor 1. commons-lang * जार को classpath में होना चाहिए 2. import org.apache.commons.lang3.StringUtils;
पीटर - मोनिका

9
मैं आपको सलाह दूंगा कि आप इस उत्तर को String.join()जावा 8 में शुरू की गई नई विधि के संदर्भ में संपादित करें । इस तरह, इस स्वीकृत उत्तर को पढ़ने वाले लोगों की भारी संख्या उस ज्ञान से लाभान्वित होगी। वर्तमान में, इस तथ्य का उल्लेख करने वाला सर्वोच्च मतदान उत्तर बल्कि नीचे खो गया है ...
डंकन जोन्स

1
यह ध्यान देने योग्य है जो String.join()केवल List<CharSequence>या CharSequence[]तत्वों के लिए काम करेगा ।
एनगो

71

यदि आप Android में क्या उपयोग करना चाहते हैं, तो यह है:

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

उदाहरण के लिए:

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

2
यह स्पष्ट रूप से सभी एंड्रॉइड संस्करणों के लिए सबसे अच्छा जवाब है, क्योंकि जावा 8 केवल एंड्रॉइड पर थोड़ा सा बाहर आ रहा है। यह समाधान एंड्रॉइड लिबास में निर्मित का उपयोग करता है, बजाय इन मूर्खतापूर्ण "एक कार्रवाई करने के लिए एक बड़ा लिब शामिल है" समाधान।
ल्यूकस्टोनहैम

यह सितंबर 2017 है, Android के लिए जावा 8 अभी भी दूर है। इस उत्तर के लिए धन्यवाद!
एनाडॉन


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 लाइनों में करने का दावा नहीं कर सकता था!
जे

8
समस्या यह है कि जब आप थोड़ी देर के बाद, या कोई और, जल्दी में है, तो एक और लाइन जोड़ें कि अगर / बिना ब्रेसिज़ जोड़ने के लिए; या (यदि == 0) के बाद वापसी शून्य हटा दें, तो कुछ मामलों में व्हिह संकलन करेगा, लेकिन गलत होगा। फिर उस समापन ब्रेस के लिए एक अतिरिक्त लाइन का त्याग करना बेहतर है (उद्घाटन उसी में रह सकता है यदि / लाइन के लिए)।
मिलन

16
मुझे लगता है कि यह भयानक है कि अधिकांश भाषाएं अपने मूल में इस तरह की कार्यक्षमता पैक करती हैं, जावा समुदाय हर किसी को पहिया को मजबूत करने के लिए प्रोत्साहित करता है।
जॉन स्ट्रिकलर

33
11 लाइनें? बाह! मैं इसे 1 में कर सकता हूं! बस स्रोत फ़ाइल में सभी नए वर्णों को हटा दें।
थॉमस एडिंग

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();
}

वोट दिया क्योंकि आपको किसी भी पुस्तकालय को जोड़ने की आवश्यकता नहीं है।
गिवेंसे

10
पंक्ति be: क्या यह बेहतर होगा कि .append()प्रत्येक के लिए दो बार उपयोग Stringकरने के बजाय उन्हें सुधारा जाए और फिर बिल्डर को जोड़ा जाए।
तलहा अहमद खान

18

हाल ही में कई सवालों के साथ, बचाव के लिए जावा 8:


Java 8 ने एक नई स्टैटिक विधि जोड़ी, java.lang.Stringजो वास्तव में आपको चाहिए

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

उसका इस्तेमाल कर रहे हैं:

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

का परिणाम:

"Hello, World, !"

14

Google अमरूद की लाइब्रेरी में भी इस तरह की क्षमता है । आप स्ट्रिंग [] उदाहरण को एपीआई से भी देख सकते हैं।

जैसा कि पहले से ही एपी में वर्णित है, बिल्डर तरीकों की अपरिहार्यता से सावधान रहें।

यह वस्तुओं की एक सरणी को स्वीकार कर सकता है इसलिए यह आपके मामले में काम करेगा। अपने पिछले अनुभव में, मैंने एक स्टैक में शामिल होने की कोशिश की जो एक चलने योग्य है और यह ठीक काम करता है।

मुझ से नमूना:

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("^\\[|\\]$", "")

हालाँकि ... यह केवल तभी काम करता है जब आप जानते हैं कि सरणी या सूची में मौजूद मान में "" स्ट्रिंग स्ट्रिंग नहीं है ""।


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
बेहतर प्रदर्शन के लिए StringBuffer (धागा-सुरक्षित) के स्थान पर StringBuilder (गैर-थ्रेड-सुरक्षित) का उपयोग करें। इंटरफ़ेस एक ही है।
असफ

2
यह snippets.dzone.com/posts/show/91 से लगता है । टिप्पणियां एक बेहतर संस्करण का सुझाव देती हैं: सार्वजनिक स्थैतिक स्ट्रिंग सम्मिलित हों (Iterable <? फैली हुई वस्तु> pColl, स्ट्रिंग विभाजक) {Iterator <? फैली हुई वस्तु> oIter; if (pColl == null || (! (oIter = pColl.iterator ()) .hasNext ())) ""; StringBuilder oBuilder = नया StringBuilder (String.valueOf (oIter.next ())); जबकि (oIter.hasNext ()) oBuilder.append (विभाजक) .append (oIter.next ()); वापसी oBuilder.toString (); }
क्वांटम 7

6

यदि आप एक त्वरित सरणी-से-स्ट्रिंग रूपांतरण की तलाश में यहां पहुंचे हैं, तो Arrays.toString () का प्रयास करें ।

Object[]पारित का एक स्ट्रिंग प्रतिनिधित्व बनाता है । परिणाम ब्रैकेट्स ( "[]") से घिरा हुआ है , प्रत्येक तत्व को स्ट्रिंग के माध्यम से परिवर्तित किया जाता है String.valueOf(Object)और इसके द्वारा अलग किया जाता है ", "। यदि सरणी है null, तो "null"वापस आ गया है।


बहुत बहुत धन्यवाद! तार "," द्वारा अलग हो गए हैं और पूरी चीज़ के चारों ओर "[]" है, जो मेरे साथ ठीक है।
जॉन हेनकेल सेप

5

बस "मैं सबसे छोटा हूं" चुनौती के लिए, यहां खदानें हैं;)

Iterative:

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()") के लिए अक्षम है ।
ओगरे Psalm33


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यदि आपको दक्षता की आवश्यकता हो तो उपयोग करें : P
Ryoichiro Oka

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
शांतचित्त

इसके अलावा, इस दृष्टिकोण का मतलब होगा कि: "" फू "," बार "} को सीमांकक के साथ एक सरणी:" "को" फू: बार: "में बदल दिया जाएगा
pioto

-2

सरल शॉर्टहैंड तकनीक है जिसका मैं ज्यादातर समय उपयोग करता हूं।

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

यह केवल लंबाई 1 के सीमांकक के साथ काम करता है और इसके लिए 'मैजिक नंबर' (हालांकि काफी स्थानीय) की आवश्यकता होती है, यदि आप एक अलग लंबाई के सीमांकक चाहते थे।
मईवल्ड

आप कई पात्रों को जोड़ते हुए जोड़ सकते हैं
गौरव आदुरकर

बस की तुलना में: op = op.substring (0, op.length () - "," लंबाई ()); क्या बड़ी बात है?
डेनिस

-3

java.util.rrays में एक 'asList' विधि है। Java.util.List / ArrayList API के साथ मिलकर यह आपको वह सब देता है जिसकी आपको आवश्यकता है :;

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
सवाल यह है कि कैसे एक सीमांकक के साथ स्ट्रिंग के एक सरणी में शामिल होना है, न कि तार के दो सरणियों को एक साथ कैसे जोड़ना है।
टूलबियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.