मैं एक स्ट्रिंग ट्रिम करना चाहता हूं अगर लंबाई 10 वर्णों से अधिक हो।
मान लीजिए कि यदि स्ट्रिंग की लंबाई 12 ( String s="abcdafghijkl") है, तो नए ट्रिम किए गए स्ट्रिंग में होगा "abcdefgh.."।
इसे कैसे प्राप्त किया जा सकता है?
मैं एक स्ट्रिंग ट्रिम करना चाहता हूं अगर लंबाई 10 वर्णों से अधिक हो।
मान लीजिए कि यदि स्ट्रिंग की लंबाई 12 ( String s="abcdafghijkl") है, तो नए ट्रिम किए गए स्ट्रिंग में होगा "abcdefgh.."।
इसे कैसे प्राप्त किया जा सकता है?
जवाबों:
s = s.substring(0, Math.min(s.length(), 10));
Math.minइस तरह का उपयोग करने से उस मामले में एक अपवाद से बचा जाता है जहां स्ट्रिंग पहले से कम है 10।
टिप्पणियाँ:
ऊपर वास्तविक ट्रिमिंग करता है। यदि आप वास्तव में डॉट्स के साथ अंतिम तीन (!) वर्णों को बदलना चाहते हैं यदि यह छोटा हो जाता है, तो अपाचे कॉमन्स का उपयोग करें StringUtils.abbreviate।
यह गलत तरीके से व्यवहार कर सकता है 1 यदि आपके स्ट्रिंग में बीएमपी के बाहर यूनिकोड कोड पॉइंट हैं; जैसे इमोजीस। एक (अधिक जटिल) समाधान के लिए जो सभी यूनिकोड कोड-बिंदुओं के लिए सही ढंग से काम करता है, @ sibnick का समाधान देखें ।
1 - एक यूनिकोड कोडपॉइंट जो कि विमान 0 पर नहीं है (BMP) को "सरोगेट पेयर" (अर्थात दो charमान) के रूप में दर्शाया गया है String। इसे अनदेखा करके, हम एक सरोगेट जोड़ी के बीच में 10 से कम कोड बिंदुओं, या (बदतर) को काट सकते हैं। दूसरी ओर, String.length()अब यूनिकोड पाठ की लंबाई का एक आदर्श उपाय नहीं है, इसलिए इसके आधार पर ट्रिमिंग करना गलत काम हो सकता है।
s = (s.length() > 10) ? s.substring(0,10) : s ;
StringUtils.abbreviateसे अपाचे कॉमन्स लैंग पुस्तकालय अपने दोस्त हो सकता है:
StringUtils.abbreviate("abcdefg", 6) = "abc..."
StringUtils.abbreviate("abcdefg", 7) = "abcdefg"
StringUtils.abbreviate("abcdefg", 8) = "abcdefg"
StringUtils.abbreviate("abcdefg", 4) = "a..."
कॉमन्स लैंग 3 भी एक कस्टम स्ट्रिंग को प्रतिस्थापन मार्कर के रूप में सेट करने की अनुमति देता है। इसके साथ आप उदाहरण के लिए एकल वर्ण दीर्घवृत्त सेट कर सकते हैं।
StringUtils.abbreviate("abcdefg", "\u2026", 6) = "abcde…"
एक अपाचे कॉमन्स StringUtilsफ़ंक्शन है जो यह करता है।
s = StringUtils.left(s, 10)
यदि लेन वर्ण उपलब्ध नहीं हैं, या स्ट्रिंग शून्य है, तो स्ट्रिंग अपवाद के बिना वापस आ जाएगी। लेन नकारात्मक होने पर एक खाली स्ट्रिंग लौटा दी जाती है।
StringUtils.left (null ) = null
StringUtils.left (( -ve) = ""
StringUtils.left ("", *) = ""
StringUtils.left ("abc", 0) = ""
StringUtils.left (") abc ", 2) =" अब "
StringUtils.left (" abc ", 4) =" Samc "
सौजन्य: स्टीव मैककॉली
हमेशा की तरह कोई भी UTF-16 सरोगेट जोड़े की परवाह नहीं करता है। उनके बारे में देखें: वास्तविक उपयोग में सबसे आम गैर-बीएमपी यूनिकोड वर्ण क्या हैं? यहां तक कि org.apache.commons / commons-lang3 के लेखक भी
आप इस नमूने में सही कोड और सामान्य कोड के बीच अंतर देख सकते हैं:
public static void main(String[] args) {
//string with FACE WITH TEARS OF JOY symbol
String s = "abcdafghi\uD83D\uDE02cdefg";
int maxWidth = 10;
System.out.println(s);
//do not care about UTF-16 surrogate pairs
System.out.println(s.substring(0, Math.min(s.length(), maxWidth)));
//correctly process UTF-16 surrogate pairs
if(s.length()>maxWidth){
int correctedMaxWidth = (Character.isLowSurrogate(s.charAt(maxWidth)))&&maxWidth>0 ? maxWidth-1 : maxWidth;
System.out.println(s.substring(0, Math.min(s.length(), correctedMaxWidth)));
}
}
या आप इस विधि का उपयोग उस स्थिति में कर सकते हैं जब आपके पास हाथ पर स्ट्रिंग स्ट्रिंग नहीं है:
public static String abbreviateString(String input, int maxLength) {
if (input.length() <= maxLength)
return input;
else
return input.substring(0, maxLength-2) + "..";
}
System.out.println(abbreviateString("ABC\ud83d\udc3bDEF", 6));
कोटलिन के साथ यह उतना ही सरल है:
yourString.take(10)
इस स्ट्रिंग से पहले n वर्ण वाले स्ट्रिंग को लौटाता है, या यदि यह स्ट्रिंग छोटी है तो संपूर्ण स्ट्रिंग।
आप ट्रंक… करते समय अंतिम स्थान पर एक दीर्घवृत्त ( ) वर्ण के लिए पूछ रहे हैं । आपके इनपुट स्ट्रिंग में हेरफेर करने के लिए यहां एक-लाइनर है।
String input = "abcdefghijkl";
String output = ( input.length () > 10 ) ? input.substring ( 0 , 10 - 1 ).concat ( "…" ) : input;
इस कोड को IdeOne.com पर लाइव देखें ।
abcdefghi ...
हम टर्नरी ऑपरेटर का उपयोग करके एक-लाइनर बना सकते हैं ।
String input = "abcdefghijkl" ;
String output =
( input.length() > 10 ) // If too long…
?
input
.substring( 0 , 10 - 1 ) // Take just the first part, adjusting by 1 to replace that last character with an ellipsis.
.concat( "…" ) // Add the ellipsis character.
: // Or, if not too long…
input // Just return original string.
;
इस कोड को IdeOne.com पर लाइव देखें ।
abcdefghi ...
जावा स्ट्रीम सुविधा जावा 9 और बाद में इसे दिलचस्प बनाती है। दिलचस्प है, लेकिन शायद सबसे अच्छा तरीका नहीं।
हम मानों के बजाय कोड बिंदुओं का उपयोग करते charहैं। charप्रकार विरासत है, और के लिए सीमित है के एक सबसेट के लिए सभी संभव यूनिकोड वर्ण।
String input = "abcdefghijkl" ;
int limit = 10 ;
String output =
input
.codePoints()
.limit( limit )
.collect( // Collect the results of processing each code point.
StringBuilder::new, // Supplier<R> supplier
StringBuilder::appendCodePoint, // ObjIntConsumer<R> accumulator
StringBuilder::append // BiConsumer<R,R> combiner
)
.toString()
;
यदि हमारे पास अतिरिक्त वर्ण थे, तो अंतिम वर्ण को एक दीर्घवृत्त से बदलें ।
if ( input.length () > limit )
{
output = output.substring ( 0 , output.length () - 1 ) + "…";
}
अगर केवल मैं "यदि सीमा से अधिक है, तो इलिप्सिस करें" भाग के साथ स्ट्रीम लाइन डालने का एक तरीका सोच सकता है।