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




string (7)

निम्नानुसार, सबस्ट्रिंग विधि का प्रयोग करें:

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

यदि एन स्ट्रिंग की लंबाई से अधिक है, तो यह एक अपवाद फेंक देगा, क्योंकि एक टिप्पणीकर्ता ने बताया है। एक साधारण समाधान यह है कि if(s.length()<n) अपने else खंड में स्थिति में लपेटें, तो आप यह चुन सकते हैं कि आप केवल संपूर्ण स्ट्रिंग को प्रिंट / वापस करना चाहते हैं या इसे किसी अन्य तरीके से संभालना चाहते हैं।

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


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

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


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;
}

तो व्यक्तिगत रूप से मैं वास्तव में NSNotFound नफरत करता NSNotFound लेकिन इसकी आवश्यकता को समझता NSNotFound

लेकिन कुछ लोग NSNotFound के खिलाफ तुलना करने की जटिलताओं को समझ नहीं सकते हैं

उदाहरण के लिए, यह कोड:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if([string rangeOfString:otherString].location != NSNotFound)
        return YES;
    else
        return NO;
}

इसकी समस्याएं हैं:

1) जाहिर है अगर अन्य otherString = nil यह कोड दुर्घटनाग्रस्त हो जाएगा। एक साधारण परीक्षण होगा:

NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");

का परिणाम !! दुर्घटना !!

2) उद्देश्य के लिए नए किसी के लिए इतना स्पष्ट नहीं है-सी यह है कि string = nil के समान कोड क्रैश नहीं होगा। उदाहरण के लिए, यह कोड:

NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");

और यह कोड:

NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");

दोनों का परिणाम होगा

does string contains string - YES

जो स्पष्ट रूप से आप नहीं चाहते हैं।

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

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    if(otherString && [string rangeOfString:otherString].length)
        return YES;
    else
        return NO;
}

या केवल:

- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
    return (otherString && [string rangeOfString:otherString].length);
}

जो मामलों 1 और 2 के लिए वापस आ जाएगा

does string contains string - NO

यह मेरा 2 सेंट है ;-)

अधिक उपयोगी कोड के लिए कृपया मेरी Gist







java string