मैं n
जावा में एक स्ट्रिंग के पहले अक्षर तक कैसे जा सकता हूं बिना आकार की जांच किए पहले (इनलाइन स्वीकार्य है) या ए का जोखिम IndexOutOfBoundsException
?
मैं n
जावा में एक स्ट्रिंग के पहले अक्षर तक कैसे जा सकता हूं बिना आकार की जांच किए पहले (इनलाइन स्वीकार्य है) या ए का जोखिम IndexOutOfBoundsException
?
जवाबों:
यहाँ एक साफ समाधान है:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
राय: जबकि इस समाधान "साफ" है, मुझे लगता है कि यह वास्तव में है कम पठनीय एक समाधान की तुलना में है कि का उपयोग करता है if
/ else
स्पष्ट तरीके से। यदि पाठक ने इस चाल को नहीं देखा है, तो उसे कोड को समझने के लिए कठिन सोचना होगा । IMO, कोड का अर्थ if
/ else
संस्करण में अधिक स्पष्ट है । एक क्लीनर / अधिक पठनीय समाधान के लिए, @ paxdiablo का उत्तर देखें।
पहिया को सुदृढ़ न करें ...:
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
जावदोक कहते हैं:
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"
StringUtils.substring(yourString, 0, n)
जैसा है वैसा नहीं है yourString.substring(0, n)
। पूर्व से है StringUtils
, जबकि बाद का उपयोग कर रहा है String.substring
(जो अपवाद देता है यदि अंत सूचकांक स्ट्रिंग की लंबाई से अधिक है)।
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
लेन नहीं है, यह एंड-इंडेक्स है।
अपाचे कॉमन्स लैंग के पास इसके लिए एक StringUtils.left
तरीका है।
String upToNCharacters = StringUtils.left(s, n);
एसओ पर सवाल का एक वर्ग है जो कभी-कभी पूर्ण अर्थ से कम बनाता है, यह एक खतरनाक रूप से करीब है :-)
शायद आप अपने दो तरीकों में से एक का उपयोग करके अपने फैलाव की व्याख्या कर सकते हैं।
यदि यह सिर्फ इसलिए है क्योंकि आप अपने कोड को if
स्टेटमेंट या अपवाद को पकड़ने वाले कोड से काली मिर्च नहीं डालना चाहते हैं , तो एक समाधान एक सहायक फ़ंक्शन का उपयोग करना है जो आपके लिए इसका ध्यान रखेगा, कुछ इस तरह:
static String substring_safe (String s, int start, int len) { ... }
जो पहले से लंबाई की जाँच करेगा और उसके अनुसार कार्य करेगा (या तो छोटे स्ट्रिंग या पैड को रिक्त स्थान के साथ लौटाएगा)।
फिर आपको अपने कोड में इसके बारे में चिंता करने की ज़रूरत नहीं है, बस कॉल करें:
String s2 = substring_safe (s, 10, 7);
के बजाय:
String s2 = s.substring (10,7);
यह उस मामले में काम करेगा जो आपको चिंतित करने वाला लगता है (अन्य उत्तरों के लिए आपकी टिप्पणियों के आधार पर), बहुत सारे स्ट्रिंग बिल्डिंग सामान करते समय कोड के प्रवाह को नहीं तोड़ना।
String upToNCharacters = String.format("%."+ n +"s", str);
अगर n
एक चर है (तो आपको प्रारूप स्ट्रिंग का निर्माण करना चाहिए)
String upToNCharacters = String.format("%.10s", str);
प्रतिस्थापन विधि का उपयोग करें, इस प्रकार है:
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
यदि n स्ट्रिंग की लंबाई से अधिक है, तो यह एक अपवाद को फेंक देगा, जैसा कि एक टिप्पणीकार ने बताया है। एक सरल उपाय यह है कि इस स्थिति if(s.length()<n)
को अपने else
खंड में लपेटें , आप यह चुन सकते हैं कि क्या आप पूरे स्ट्रिंग को प्रिंट / वापस करना चाहते हैं या इसे दूसरे तरीके से संभालना चाहते हैं।
यदि आप कोटलिन के साथ विकसित करने के लिए पर्याप्त भाग्यशाली हैं,
तो आप take
अपने लक्ष्य को प्राप्त करने के लिए उपयोग कर सकते हैं ।
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons ने मुझे आश्चर्यचकित किया, 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;
}