java - एक स्ट्रिंगबिल्डर के अंतिम चरित्र को हटा दें?




stringbuilder (11)

जब आपको किसी संग्रह के माध्यम से लूप करना होता है और एक डिलीमीटर द्वारा अलग किए गए प्रत्येक डेटा की एक स्ट्रिंग बनाना होता है, तो आप हमेशा अंत में एक अतिरिक्त डिलीमीटर के साथ समाप्त होते हैं, उदाहरण के लिए

for(String serverId : serverIds) {
 sb.append(serverId);
 sb.append(",");
}

कुछ देता है: serverId_1, serverId_2, serverId_3,

मैं स्ट्रिंगबिल्डर में अंतिम चरित्र को हटाना चाहता हूं (इसे परिवर्तित किए बिना क्योंकि मुझे अभी भी इस लूप के बाद इसकी आवश्यकता है)।


आप अपने जेनरेट किए गए टेक्स्ट से अंतिम चरित्र को हटाने के बजाय 'जॉइनर' कक्षा का उपयोग करने का प्रयास कर सकते हैं;

                List<String> textList = new ArrayList<>();
                textList.add("text1");
                textList.add("text2");
                textList.add("text3");

                Joiner joiner = Joiner.on(",").useForNull("null");
                String output = joiner.join(textList);

               //output : "text1,text2,text3"

इस मामले में,

sb.setLength(sb.length() - 1);

बेहतर है क्योंकि यह केवल '\0' लिए अंतिम मान असाइन करता है जबकि अंतिम वर्ण को हटाकर System.arraycopy करता है


एक और विकल्प

for(String serverId : serverIds) {
   sb.append(",");
   sb.append(serverId); 
}
sb.deleteCharAt(0);

जावा 8 के रूप में, इसमें एक नया StringJoiner क्लास बनाया गया है।

StringJoiner sj = new StringJoiner(", ");
for (String serverId : serverIds) {
    sj.add(serverId)
}

फिर भी एक और विकल्प:

public String join(Collection<String> collection, String seperator) {
    if (collection.isEmpty()) return "";

    Iterator<String> iter = collection.iterator();
    StringBuilder sb = new StringBuilder(iter.next());
    while (iter.hasNext()) {
        sb.append(seperator);
        sb.append(iter.next());
    }

    return sb.toString();
}

बस अंतिम चरित्र घटना की स्थिति प्राप्त करें।

for(String serverId : serverIds) {
 sb.append(serverId);
 sb.append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));

चूंकि lastIndexOf एक रिवर्स खोज करेगा, और आप जानते हैं कि यह पहली कोशिश में मिलेगा, प्रदर्शन यहां कोई समस्या नहीं होगी।


मैं व्यक्तिगत रूप से अंत में बैकस्पेस वर्ण (या अधिक लंबे समय तक "डिलीमीटर") जोड़ना पसंद करता हूं:

for(String serverId : serverIds) {
    sb.append(serverId);
    sb.append(",");
}

sb.append('\b');

ध्यान दें कि इसमें समस्याएं हैं:

  • कैसे \b प्रदर्शित किया जाता है पर्यावरण पर निर्भर करता है,
  • String सामग्री की length() "visibile" वर्णों की लंबाई से अलग हो सकती है

जब \b ठीक दिखता है और लंबाई कोई कंसोल पर लॉग इन करने जैसी कोई फर्क नहीं पड़ता है, तो यह मेरे लिए काफी अच्छा लगता है।


यहां एक और समाधान है:

for(String serverId : serverIds) {
   sb.append(",");
   sb.append(serverId); 
}

String resultingString = "";
if ( sb.length() > 1 ) {
    resultingString = sb.substring(1);
}

Java-8 आप String क्लास की स्थिर विधि का उपयोग कर सकते हैं,

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

public class Test {

    public static void main(String[] args) {

        List<String> names = new ArrayList<>();
        names.add("James");
        names.add("Harry");
        names.add("Roy");
        System.out.println(String.join(",", names));
    }
}

आउटपुट

James,Harry,Roy

prefix उपयोग reinit (प्रदर्शन को प्रभावित करने) से बचने के लिए TextUtils.isEmpty:

            String prefix = "";
            for (String item : list) {
                sb.append(prefix);
                if (TextUtils.isEmpty(prefix))
                    prefix = ",";
                sb.append(item);
            }

sb.deleteCharAt(sb.length()-1) 






stringbuilder