मुझे पता है कि यह एक नौसिखिया सवाल है, लेकिन क्या जावा में C # के स्ट्रिंग ऑपरेशन के समतुल्य हैं?
विशेष रूप से, मैं बात कर रहा हूँ String.Formatऔर String.Join।
मुझे पता है कि यह एक नौसिखिया सवाल है, लेकिन क्या जावा में C # के स्ट्रिंग ऑपरेशन के समतुल्य हैं?
विशेष रूप से, मैं बात कर रहा हूँ String.Formatऔर String.Join।
जवाबों:
जावा स्ट्रिंग ऑब्जेक्ट में एक formatविधि (1.5 के रूप में) है, लेकिन कोई joinविधि नहीं है।
उपयोगी स्ट्रिंग उपयोगिता विधियों का एक समूह प्राप्त करने के लिए पहले से ही शामिल नहीं है । आप org.apache.commons.lang.StringUtils का उपयोग कर सकते हैं ।
String.join()विधि का परिचय देता है ।
String.format । शामिल होने के लिए, आपको अपना खुद का लिखना होगा:
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 से आता है
जावा 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"
Java 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"
TextUtils.join Android पर उपलब्ध है
शामिल होने के लिए, मेरा मानना है कि यह थोड़ा कम जटिल लग सकता है:
public String join (Collection<String> c) {
StringBuilder sb=new StringBuilder();
for(String s: c)
sb.append(s);
return sb.toString();
}
मुझे जावा 5 सिंटैक्स का उपयोग करने की आवश्यकता नहीं है जितना मैं चाहूंगा (विश्वास करें या नहीं, मैं 1.0.x का उपयोग कर रहा हूं) इसलिए मैं थोड़ा कठोर हो सकता हूं, लेकिन मुझे यकीन है कि अवधारणा सही है ।
एडिट एडिशन: स्ट्रिंग एप्स धीमा हो सकता है, लेकिन यदि आप GUI कोड या कुछ शॉर्ट-रनिंग रूटीन पर काम कर रहे हैं, तो यह वास्तव में मायने नहीं रखता है अगर आप .005 सेकंड या .006 लेते हैं, तो यदि आपके पास "joinMe" नामक एक संग्रह है। कि आप एक मौजूदा स्ट्रिंग "लक्ष्य" को जोड़ना चाहते हैं, यह सिर्फ इनलाइन के लिए भीषण नहीं होगा:
for(String s : joinMe)
target += s;
यह काफी अक्षम (और एक बुरी आदत) है, लेकिन कुछ भी नहीं जिसे आप समझ पाएंगे जब तक कि हजारों तार नहीं हैं या यह एक विशाल लूप के अंदर है या आपका कोड वास्तव में प्रदर्शन महत्वपूर्ण है।
अधिक महत्वपूर्ण बात, यह याद रखना आसान है, छोटा, त्वरित और बहुत पठनीय। प्रदर्शन हमेशा डिज़ाइन विकल्पों में स्वत: विजेता नहीं होता है।
यहाँ एक बहुत ही सरल उत्तर है। +=चूंकि यह कम कोड का उपयोग करता है और अनुकूलक को इसे आपके लिए परिवर्तित करने StringBuilderदेता है। इस पद्धति का उपयोग करते हुए, आपको अपने लूप (प्रदर्शन सुधार) में कोई "अंतिम" चेक नहीं करना है और आपको अंत में किसी भी सीमांकक को अलग करने के बारे में चिंता करने की आवश्यकता नहीं है।
Iterator<String> iter = args.iterator();
output += iter.hasNext() ? iter.next() : "";
while (iter.hasNext()) {
output += "," + iter.next();
}
मैं एक पूरी अपाचे लाइब्रेरी को एक साधारण जॉइन फंक्शन जोड़ने के लिए आयात नहीं करना चाहता था, इसलिए यहाँ मेरा हैक है।
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मौजूद नहीं है, और पूरे समारोह अब एक स्ट्रिंग रिटर्न ... इसे ठीक करेंगे।
यदि आप एक में कई तार जुड़ना चाहते हैं (संक्षिप्त), तो आपको स्ट्रिंग स्ट्रिंग का उपयोग करना चाहिए। यह उपयोग करने से कहीं बेहतर है
for(String s : joinMe)
target += s;
StringBuffer पर एक मामूली प्रदर्शन जीत भी है, क्योंकि StringBuilder सिंक्रनाइज़ेशन का उपयोग नहीं करता है।
इस तरह एक सामान्य प्रयोजन उपयोगिता विधि के लिए, यह (अंततः) कई स्थितियों में कई बार कहा जाएगा, इसलिए आपको इसे कुशल बनाना चाहिए और कई क्षणिक वस्तुओं को आवंटित नहीं करना चाहिए। हमने कई, कई अलग-अलग जावा एप्स को प्रोफाइल किया है और लगभग हमेशा पाया है कि स्ट्रिंग कॉन्फैक्शन और स्ट्रिंग / चार [] आवंटन समय / मेमोरी का एक महत्वपूर्ण हिस्सा लेते हैं।
हमारा पुन: प्रयोज्य संग्रह -> स्ट्रिंग विधि पहले आवश्यक परिणाम के आकार की गणना करती है और फिर उस प्रारंभिक आकार के साथ एक स्ट्रिंगबर्स्ट बनाता है; यह आवेषण को जोड़ते समय उपयोग किए जाने वाले आंतरिक चार [] के दोहरीकरण / नकल से बचा जाता है।
मैंने खुद लिखा:
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();
}
लेकिन CollectionJSP द्वारा समर्थित नहीं है, इसलिए टैग फ़ंक्शन के लिए मैंने लिखा है:
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>
और JSP फ़ाइलों में इसका उपयोग करें:
<%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%>
${funnyFmt:join(books, ", ")}
StringUtils Apache Commons Lang लाइब्रेरी में एक बहुत ही उपयोगी क्लास है।
वहाँ है MessageFormat.format()जो सी # की तरह काम करता है String.Format()।
मैं String.Join के अत्यधिक जटिल कार्यान्वयन को देखता हूं। यदि आपके पास जावा 1.8 नहीं है, और आप एक नया पुस्तकालय आयात नहीं करना चाहते हैं तो नीचे के कार्यान्वयन को पर्याप्त होना चाहिए।
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();
}
ArrayList<Double> j=new ArrayList<>;
j.add(1);
j.add(.92);
j.add(3);
String ntop=j.toString(); //ntop= "[1, 0.92, 3]"
तो मूल रूप से, स्ट्रिंग ntop पूरे संग्रह का मान अल्पविराम विभाजक और कोष्ठक के साथ संग्रहीत करता है।
मैं दो स्ट्रिंग में शामिल होने के लिए स्ट्रिंग स्ट्रिंग संचालक "+" का उपयोग करूंगा। s1 += s2;