2011-10-15 15 views
9

बनाने के लिए जावा concatenate मैं जावा का उपयोग कर इस समय एक एमयूडी (पाठ आधारित खेल) लिख रहा हूँ। एमयूडी के प्रमुख पहलुओं में से एक तारों को स्वरूपित कर रहा है और इसे वापस उपयोगकर्ता को भेज रहा है। यह सबसे अच्छा कैसे किया जाएगा?जावा स्ट्रिंग या प्रारूप

मैं निम्न स्ट्रिंग भेजना चाहते थे कहते हैं: "! हैलो"

आप किसी को कहते हैं - जहां "कोई", "कहें" और "हैलो!" सभी चर हैं। कौन सा सर्वश्रेष्ठ प्रदर्शन के रूप में होगा?

"You " + verb + " to " + user + " \"" + text + "\""

या

String.format("You %1$s to %2$s \"%3$s\"", verb, user, text)

या कुछ अन्य विकल्प?

मुझे यकीन नहीं है कि अंत में उपयोग करना आसान होगा (जो महत्वपूर्ण है क्योंकि यह हर जगह होगा), लेकिन मैं इस बिंदु पर इसके बारे में सोच रहा हूं क्योंकि + के साथ मिलकर मिल रहा है कुछ बड़ी लाइनों के साथ थोड़ा उलझन में। मुझे लगता है कि इस मामले में स्ट्रिंगबिल्डर का उपयोग करके इसे कम पढ़ा जा सकता है।

कोई सुझाव यहाँ?

+7

प्रदर्शन के बारे में चिंता न करें जबतक कि आपको कोई समस्या न हो और यह बाधा हो। जो कुछ भी आपको लगता है वह सबसे अधिक पढ़ने योग्य और रखरखाव योग्य कोड का नेतृत्व करेगा। –

उत्तर

17

यदि स्ट्रिंग्स को एक एकल संयोजन अभिव्यक्ति का उपयोग करके बनाया गया है; जैसे

String s = "You " + verb + " to " + user + " \"" + text + "\""; 

तो इस के लिए और अधिक घना कम या ज्यादा बराबर है:

StringBuilder sb = new StringBuilder(); 
sb.append("You"); 
sb.append(verb); 
sb.append(" to "); 
sb.append(user); 
sb.append(" \""); 
sb.append(text); 
sb.append('"'); 
String s = sb.toString(); 

(वास्तव में, जावा कम्पाइलर पूर्व उत्तरार्द्ध में संकलित होगा ... लगभग।)

जब आप मध्यवर्ती तार बनाना शुरू करते हैं, या += का उपयोग करके स्ट्रिंग का निर्माण करते हैं तो दक्षता समस्या उत्पन्न होती है। उस बिंदु पर, StringBuilder अधिक कुशल बन जाता है क्योंकि आप बनाए गए मध्यवर्ती तारों की संख्या को कम करते हैं और फिर फेंक देते हैं।

अब जब आप String.format() का उपयोग करते हैं, तो यह हुड के नीचे StringBuilder का उपयोग करना चाहिए। हालांकि, format को प्रत्येक बार जब आप कॉल करते हैं तो स्ट्रिंग प्रारूप को पर्स करना पड़ता है, और यह एक ओवरहेड है जो आपके पास स्ट्रिंग बिल्डिंग को बेहतर तरीके से नहीं करता है।


यह कहकर, मेरा सलाह कोड को सबसे अधिक पढ़ने योग्य तरीके से लिखना होगा। प्रोफाइलिंग प्रोफाइलिंग आपको बताता है कि यह एक वास्तविक प्रदर्शन चिंता है, तो स्ट्रिंग बनाने के सबसे प्रभावी तरीके के बारे में केवल चिंता करें। (फिलहाल, आप एक प्रदर्शन समस्या को हल करने के तरीकों के बारे में सोचने में समय व्यतीत कर रहे हैं जो महत्वहीन या अप्रासंगिक हो सकता है।)

एक अन्य उत्तर का उल्लेख है कि प्रारूप स्ट्रिंग का उपयोग करके कई भाषाओं के लिए समर्थन आसान हो सकता है। यह सच है, हालांकि इस तरह की चीजें हैं कि आप ऐसी चीजों के संबंध में क्या कर सकते हैं जैसे बहुवचन, लिंग, आदि।

+1

विस्तृत स्पष्टीकरण के लिए धन्यवाद, इससे मुझे चीजों को सोचने में मदद मिली। मैं String.format के साथ जाने जा रहा हूं क्योंकि यह एक है) एक निर्मित समाधान और बी) तारों को और अधिक पठनीय बनाकर पहले से ही अपना जीवन आसान बना रहा है। – two13

-1

मुझे लगता है कि स्ट्रिंग.फॉर्मैट क्लीनर दिखता है। हालांकि आप स्ट्रिंगबिल्डर का उपयोग कर सकते हैं और स्ट्रिन बनाने के लिए एपेंड फ़ंक्शन का उपयोग कर सकते हैं

1

प्लस के साथ Concateneting, कंपाइलेट कोड को निष्पादित तरीके से बदल सकता है। स्ट्रिंग प्रारूप के साथ मैं नहीं जानता।

मैं प्लस के साथ कोकेटेनेशन पसंद करता हूं, मुझे लगता है कि अंडरसैंड करना आसान है।

0

मैं ईमानदार रहूंगा और सुझाव दूंगा कि यदि आप कम टाइपिंग चाहते हैं, या बाद वाला व्यक्ति यदि आप इसे करने का अधिक सी-शैली तरीका ढूंढ रहे हैं तो आप पहले व्यक्ति को लेंगे।

मैं यहां एक मिनट या दो मिनट के लिए बैठ गया था कि क्या समस्या हो सकती है, लेकिन मुझे लगता है कि यह कितना आप टाइप करना चाहते हैं।

किसी और के पास कोई विचार है?

+0

इसके पीछे मेरा तर्क पठनीयता के बारे में अधिक है। मैं "सामान" + "अन्य सामान" टाइप करने के लिए काफी उपयोग करता हूं और यदि मैं किसी अन्य विकल्प के साथ जाता हूं तो शायद मुझे उस आदत से खुद को तोड़ना होगा। जो मैं मूल रूप से सोच रहा था वह "यू [क्रिया] [उपयोगकर्ता] [पाठ]" जैसा था और एक प्रतिस्थापन (कक्षा संचालित, तो मैं सेटएलेमेंट ("क्रिया", क्रिया) जैसे चर जोड़ता हूं और फिर यह थूक जाएगा एक स्वरूपित स्ट्रिंग वापस), लेकिन .format भर में ठोकर लगा और मेरा मूल विचार प्रदर्शन के साथ भयानक होगा (लेकिन पढ़ने के लिए सुपर आसान)। – two13

0

मान लिया जाये कि आप पुन: उपयोग करने के लिए आधार तार अक्सर की तरह

स्ट्रिंग mystring = "आप $ 1 $ 2 \" $ 3 \ ""

तो बस एक प्रति प्राप्त करते हैं और एक की जगह $ एक्स अपने टेम्पलेट स्टोर जा रहे हैं आप जो चाहते हैं उसके साथ।

यह संसाधन फ़ाइल के लिए भी वास्तव में अच्छा काम करेगा।

+1

इसके अलावा आप कई भाषाओं का समर्थन कर सकते हैं: http://download.oracle.com/javase/tutorial/i18n/resbundle/concept.html –

-2

सबसे अच्छा, प्रदर्शन-वार, शायद स्ट्रिंगबफर का उपयोग करना होगा।

+1

असहमत। ['स्ट्रिंगबिल्डर '] से (http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html) javadoc: जहां संभव हो, यह अनुशंसा की जाती है कि इस वर्ग का उपयोग किया जाए 'स्ट्रिंगबफर' की प्राथमिकता क्योंकि यह अधिकांश कार्यान्वयन के तहत तेज़ी से होगी। --- बीटीडब्लू।, मुझे संदेह है कि इस तरह के एक आवेदन में स्ट्रिंग कॉन्सटेनेशन बाधा है। – michael667

+1

वही अंतर, एक सिंक्रनाइज़, एक नहीं। जब सिंक्रनाइज़ेशन सही ढंग से कार्यान्वित किया जाता है तो कोई विवाद नहीं होने पर अंतर नगण्य होता है।(और जाहिर है, अगर कोई विवाद हो तो स्ट्रिंगबिल्डर का उपयोग नहीं करना चाहेंगे।) –

1

इसे सरल रखने की कुंजी इसे कभी भी देखना नहीं है। यहां मेरा मतलब है:

Joiner join = Joiner.on(" "); 

public void constructMessage(StringBuilder sb, Iterable<String> words) { 
    join.appendTo(sb, words); 
} 

मैं पियाने योग्यता को गैर-मुद्दे बनाने के लिए गुवा जॉइनर क्लास का उपयोग कर रहा हूं। "शामिल" से स्पष्ट क्या हो सकता है? Concatenation के बारे में सभी बुरा बिट्स अच्छी तरह से छिपे हुए हैं। Iterable का उपयोग करके, मैं इस विधि का उपयोग सभी प्रकार के डेटा संरचनाओं के साथ कर सकता हूं, सूचियां सबसे स्पष्ट हैं।

यहां एक अमरूद इम्यूटेबल लिस्ट (जो नियमित सूची की तुलना में अधिक कुशल है, का उपयोग करके कॉल का एक उदाहरण है, क्योंकि सूची को संशोधित करने वाले किसी भी तरीके से अपवाद फेंकते हैं, और सही ढंग से इस तथ्य का प्रतिनिधित्व करते हैं कि निर्माण मैसेज() सूची बदल नहीं सकता शब्द, बस इसे उपभोग):

StringBuilder outputMessage = new StringBuilder(); 
constructMessage(outputMessage, 
     new ImmutableList.Builder<String>() 
      .add("You", verb, "to", user, "\"", text, "\"") 
      .build()); 
0

मुझे लगता है कि + साथ कि संयोजन String.format का उपयोग कर अधिक से अधिक पठनीय है।

String.format अच्छा है जब आपको संख्या और तिथियां प्रारूपित करने की आवश्यकता होती है।

संबंधित मुद्दे