java - मैं आकार की जांच किए बिना या सीमा से बाहर जाने के बिना स्ट्रिंग के पहले एन अक्षर कैसे प्राप्त करूं?




string (5)

मैं जावा में किसी स्ट्रिंग के पहले n अक्षरों को पहले आकार की जांच के बिना कैसे प्राप्त करूं (इनलाइन स्वीकार्य है) या IndexOutOfBoundsException जोखिम IndexOutOfBoundsException ?


ApacheCommons ने मुझे आश्चर्यचकित कर दिया, StringUtils. संक्षिप्त StringUtils.abbreviate(String str, int maxWidth) "..." पोस्टफिक्स को बदलने का कोई विकल्प नहीं है। WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) अगले खाली स्थान पर दिखता है।

मैं इसे यहां छोड़ने जा रहा हूं:

public static String abbreviate(String s, int maxLength, String appendToEnd) {
    String result = s;
    appendToEnd = appendToEnd == null ? "" : appendToEnd;
    if (maxLength >= appendToEnd.length()) {
        if (s.length()>maxLength) {
            result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
        }
    } else {
        throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
    }
    return result;
}

एसओ पर सवाल का एक वर्ग है जो कभी-कभी पूर्ण ज्ञान से कम बना देता है, यह खतरनाक रूप से करीब है :-)

शायद आप दो विधियों में से एक का उपयोग करने के लिए अपने विचलन को समझा सकते हैं।

अगर ऐसा इसलिए है क्योंकि आप कथन या अपवाद पकड़ने वाले कोड के साथ अपने कोड को मिर्च नहीं करना चाहते हैं, तो एक समाधान एक सहायक फ़ंक्शन का उपयोग करना है जो आपके लिए इसका ख्याल रखेगा, जैसे कुछ:

static String substring_safe (String s, int start, int len) { ... }

जो पहले से लंबाई की जांच करेगा और तदनुसार कार्य करेगा (या तो रिक्त स्थान के साथ छोटी स्ट्रिंग या पैड लौटाएं)।

तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है, बस कॉल करें:

String s2 = substring_safe (s, 10, 7);

के बजाय:

String s2 = s.substring (10,7);

यह इस मामले में काम करेगा कि आप चिंतित होने के बारे में चिंतित हैं (अन्य उत्तरों पर आपकी टिप्पणियों के आधार पर), स्ट्रिंग बिल्डिंग सामानों के दौरान कोड के प्रवाह को तोड़ना नहीं।


पहिया को फिर से न करें ...:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)

Javadoc कहते हैं:

StringUtils.substring(null, *, *)    = null
StringUtils.substring("", * ,  *)    = "";
StringUtils.substring("abc", 0, 2)   = "ab"
StringUtils.substring("abc", 2, 0)   = ""
StringUtils.substring("abc", 2, 4)   = "c"
StringUtils.substring("abc", 4, 6)   = ""
StringUtils.substring("abc", 2, 2)   = ""
StringUtils.substring("abc", -2, -1) = "b"
StringUtils.substring("abc", -4, 2)  = "ab"

इस प्रकार:

StringUtils.substring("abc", 0, 4) = "abc"

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

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

राय: जबकि यह समाधान "साफ" है, मुझे लगता है कि यह वास्तव में ऐसे समाधान से कम पठनीय है जो स्पष्ट रूप से / else का उपयोग करता है। अगर पाठक ने इस चाल को नहीं देखा है, तो उसे कोड को समझने के लिए कठिन विचार करना होगा। आईएमओ, कोड का अर्थ if / else संस्करण में अधिक स्पष्ट है। एक क्लीनर / अधिक पठनीय समाधान के लिए, @ paxdiablo का उत्तर देखें।


String upToNCharacters = String.format("%."+ n +"s", str);

भयानक अगर n एक चर है (तो आपको प्रारूप स्ट्रिंग का निर्माण करना होगा), लेकिन स्थिर होने पर बहुत स्पष्ट है:

String upToNCharacters = String.format("%.10s", str);

docs






string