2008-09-30 9 views
7

मैं जावा में StringBuffer उपयोग कर रहा हूँ, एक साथ तार concat इसलिए की तरह करने के लिए:जावा: StringBuffer और कड़ी

StringBuffer str = new StringBuffer(); 

str.append("string value"); 

मैं अगर वहाँ एक तरीका है (हालांकि मैं एक त्वरित से कुछ भी नहीं मिला जानना चाहते हैं प्रलेखन पर नज़र) या "पैडिंग" जोड़ने के लिए कुछ और तरीका।

मुझे समझाएं; हर बार जब मैं स्ट्रिंग के लिए कुछ संलग्न, मैं अंत में एक अंतरिक्ष जोड़ने के लिए है, इसलिए की तरह हैं:

String foo = "string value"; 
str.append(foo + " "); 

और मैं संलग्न करने के लिए कई कॉल .. और हर बार, मैं एक अंतरिक्ष जोड़ना चाहते हैं। क्या वस्तु को सेट करने का कोई तरीका है ताकि प्रत्येक संलग्न होने के बाद यह स्वचालित रूप से एक स्थान जोड़ सके?

संपादित करें -

String input 
StringBuffer query = new StringBuffer(); 
Scanner scanner = new Scanner(System.in); 
scanner.UseDelimiter("\n"); 

do { 
    System.out.println("sql> "); 

    input = scanner.next(); 

    if (!empty(input)) query.append(input); 

    if (query.toString().trim().endsWith(";")) { 
     //run query 
    } 
} 
while (!input.equalsIgnoreCase("exit"); 

हालांकि के रूप में grom सुझाव दिया मैं StringBuilder का उपयोग करेंगे, लेकिन यह कैसे कोड अभी लग रहा है

+0

क्या आप हमें अपना कुछ वास्तविक कोड दिखा सकते हैं जहां आप आइटम जोड़ रहे हैं? क्योंकि शायद स्ट्रिंग बनाने का एक और तरीका है जो अधिक समझ में आता है। – grom

+0

हम्म, मैं मूल रूप से एक डू-लूप लूप करता हूं जो एक स्ट्रिंग में इनपुट जोड़ता है और लूप मौजूद होता है जब इनपुट ";" –

+0

यह निर्धारित करने के लिए कि क्या क्वेरी चलाने या नहीं, यह निर्धारित करने के लिए नियमित अभिव्यक्ति का उपयोग करने के लिए शायद यह अधिक सुरुचिपूर्ण (और तेज) है, उदाहरण के लिए: यदि (query.matches ("। *; \ S *")) { –

उत्तर

9

मैं इस आसान नियंत्रित किया जाता है या तो एक सहायक विधि (अपरीक्षित कोड) के साथ लगता है इस विषय पर article है।

उम्मीद है कि यह मदद करता है!:)

+1

इसे आजमा सकते हैं! कोड पर समय बिताने के लिए धन्यवाद :) –

+0

मेरी खुशी। अगर आप किसी भी तरह की समस्याओं में भाग लेते हैं तो मुझे बताएं और मुझे मदद करने में खुशी होगी! :) – kolrie

2

बस अंतरिक्ष अपने आप को जोड़ है, यह काफी आसान है, अपने स्वयं के अनुसार है उदाहरण।

+0

हाँ यह आसान है, लेकिन मैं इसे गंदा लगता है। और अगर मैं अपने दिमाग को बदलने और अंतरिक्ष के बजाय बदलना चाहता हूं, तो मुझे कुछ अन्य चरित्र चाहिए, मुझे एक की बजाय कई लाइनों से गुजरना होगा! –

+0

हालांकि हाँ, मैं यह कर सकता था: स्ट्रिंग बार = ""; str.append (foo + bar); लेकिन फिर भी मैं यह जानना चाहता हूं कि –

2

क्या आप एक नई कक्षा नहीं बना सकते हैं जो StringBuffer के आसपास लपेटती है और appendWithTrailingSpace() विधि जोड़ती है?

CustomStringBuffer str = new CustomStringBuffer(); 
str.appendWithTrailingSpace("string value"); 

(यद्यपि आप अपने विधि कुछ में थोड़ा छोटा कॉल करने के लिए। चाहते हो सकता है)

+0

ऐसा करने का बेहतर तरीका है या नहीं, यह संभव नहीं होना चाहिए। स्ट्रिंगबफर अंतिम है, यानी इससे कोई व्युत्पन्न नहीं है। – Burkhard

+0

गलत जवाब कैसे स्वीकार किया जाता है और इससे भी बदतर हो जाता है? स्ट्रिंगबफर – grom

+0

व्हाउप्स को उपclass करना संभव नहीं है। आप सही हे। मैंने "विस्तार" के बजाय "लपेटें" पढ़ने के लिए जवाब बदल दिया है। अफसोस की बात यह है कि यह इस तरह से साफ नहीं है। –

4

StringBuffer अंतिम है। आप इससे प्राप्त नहीं कर सकते हैं। सबसे अच्छा समाधान वास्तव में अपने लिए पैडिंग जोड़ना है। इसके लिए एक विधि लिखें और एक पैडिंग-कॉन्स्टेंट का उपयोग करें ताकि आप इसे आसानी से बदल सकें, या बेहतर पैरामीटर में डाल दें।

6

आपको StringBuilder का उपयोग करना चाहिए।

जहां संभव हो, यह अनुशंसा की जाती है कि इस वर्ग का उपयोग स्ट्रिंगबफर को वरीयता में किया जाए क्योंकि यह अधिकतर कार्यान्वयन के तहत तेज़ी से होगा।

1

एक और संभावना है कि StringBuilder खुद वस्तुओं लौटने जब आप संलग्न कहते हैं, जिसका अर्थ है आप क्या कर सकते हैं: काफी के रूप में चालाक

str.append("string value").append(" "); 

नहीं, लेकिन यह शायद + "" विधि की तुलना में एक आसान उपाय है।

एक और संभावना है कि एक रैपर वर्ग बनाने के लिए, जैसे पैडडस्टिंगबिल्डर, जो एक ही तरीके प्रदान करता है लेकिन वह पैडिंग लागू करता है जिसे आप चाहते हैं, क्योंकि आप वारिस नहीं कर सकते हैं।

public String myMethod() { 
    StringBuilder sb = new StringBuilder(); 
    addToBuffer(sb, "Hello").addToBuffer("there,"); 
    addToBuffer(sb, "it").addToBuffer(sb, "works"); 
} 

private StringBuilder addToBuffer(StringBuilder sb, String what) { 
    return sb.append(what).append(' '); // char is even faster here! ;) 
} 

या यहां तक ​​कि एक धाराप्रवाह इंटरफेस (भी अपरीक्षित कोड) के साथ एक बिल्डर पद्धति का उपयोग कर:

public String myMethod() { 
    SBBuilder builder = new SBBuilder() 
     .add("Hello").add("there") 
     .add("it", "works", "just", "fine!"); 

    for (int i = 0; i < 10; i++) { 
     builder.add("adding").add(String.valueOf(i)); 
    } 

    System.out.println(builder.build()); 
} 

public static class SBBuilder { 
    private StringBuilder sb = new StringBuilder(); 

    public SBBuilder add(String... parts) { 
     for (String p : parts) { 
      sb.append(p).append(' '); // char is even faster here! ;) 
     } 
     return this; 
    } 

    public String build() { 
     return sb.toString(); 
    } 
} 

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