स्ट्रिंग की लंबाई के आधार पर एक स्ट्रिंग ट्रिम करें


136

मैं एक स्ट्रिंग ट्रिम करना चाहता हूं अगर लंबाई 10 वर्णों से अधिक हो।

मान लीजिए कि यदि स्ट्रिंग की लंबाई 12 ( String s="abcdafghijkl") है, तो नए ट्रिम किए गए स्ट्रिंग में होगा "abcdefgh.."

इसे कैसे प्राप्त किया जा सकता है?



FYI करें, एक HORIZONTAL ELLIPSIS एक एकल वर्ण है, दो या तीन पूर्ण STOP वर्ण नहीं हैं: ...
तुलसी Bourque

जवाबों:


262
s = s.substring(0, Math.min(s.length(), 10));

Math.minइस तरह का उपयोग करने से उस मामले में एक अपवाद से बचा जाता है जहां स्ट्रिंग पहले से कम है 10


टिप्पणियाँ:

  1. ऊपर वास्तविक ट्रिमिंग करता है। यदि आप वास्तव में डॉट्स के साथ अंतिम तीन (!) वर्णों को बदलना चाहते हैं यदि यह छोटा हो जाता है, तो अपाचे कॉमन्स का उपयोग करें StringUtils.abbreviate

  2. यह गलत तरीके से व्यवहार कर सकता है 1 यदि आपके स्ट्रिंग में बीएमपी के बाहर यूनिकोड कोड पॉइंट हैं; जैसे इमोजीस। एक (अधिक जटिल) समाधान के लिए जो सभी यूनिकोड कोड-बिंदुओं के लिए सही ढंग से काम करता है, @ sibnick का समाधान देखें


1 - एक यूनिकोड कोडपॉइंट जो कि विमान 0 पर नहीं है (BMP) को "सरोगेट पेयर" (अर्थात दो charमान) के रूप में दर्शाया गया है String। इसे अनदेखा करके, हम एक सरोगेट जोड़ी के बीच में 10 से कम कोड बिंदुओं, या (बदतर) को काट सकते हैं। दूसरी ओर, String.length()अब यूनिकोड पाठ की लंबाई का एक आदर्श उपाय नहीं है, इसलिए इसके आधार पर ट्रिमिंग करना गलत काम हो सकता है।


Math.min के बजाय हम एक सशर्त जाँच नहीं कर सकते हैं और केवल स्ट्रिंग को अधिकतम करने की आवश्यकता होने पर प्रतिस्थापन कर सकते हैं? उदाहरण:s = (s.length() > 10) ? s.substring(0,10) : s ;
रामा

1
हां बेशक आप कर सकते हैं। समस्या को हल करने के अन्य तरीकों के लिए अन्य उत्तर पढ़ें!
स्टीफन सी

132

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…"

5
यह हो सकता है, लेकिन ओपी का सवाल "दीर्घवृत्त" नहीं पूछता है।
स्टीफन सी

9
@StephenC - प्रश्न 8 वर्णों को दिखाता है, जिसके बाद 2 बिंदु हैं, 10 की लंबाई सीमा दी गई है, जो एक दीर्घवृत्त (3 के बजाय सिर्फ 2 बिंदु) जैसा है। इसकी यह भी संभावना है कि इस प्रश्न को खोजने वाले कई लोग एक दीर्घवृत्त को उपयोगी मानेंगे।
ToolmakerSteve

12
... और यदि आप दीर्घवृत्त नहीं चाहते हैं, तो StringUtils.left () आपकी मदद कर सकता है।
सुपरऑल

1
FYI करें, एक HORIZONTAL ELLIPSIS एक एकल पात्र है, न कि तीन पूर्ण STOP वर्ण:…
तुलसी बोर्क

53

एक अपाचे कॉमन्स 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 "

StringUtils.Left JavaDocs

सौजन्य: स्टीव मैककॉली


22

हमेशा की तरह कोई भी 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)));
    }
}

1
अपाचे कॉमन्स के जीरा
रयान क्विन

10

s = s.length() > 10 ? s.substring(0, 9) : s;


16
प्रतिस्थापन का दूसरा पैमाना अनन्य है, इसलिए यह उत्तर स्ट्रिंग को 9 वर्णों तक ले जाता है।
इमुल्काही

8

या आप इस विधि का उपयोग उस स्थिति में कर सकते हैं जब आपके पास हाथ पर स्ट्रिंग स्ट्रिंग नहीं है:

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));
T3rm1

4

बस मामले में आप एक स्ट्रिंग के कम से कम 10 वर्णों को ट्रिम करने और रखने के लिए देख रहे हैं।

s = s.substring(Math.max(s.length(),10) - 10);

3

कोटलिन के साथ यह उतना ही सरल है:

yourString.take(10)

इस स्ट्रिंग से पहले n वर्ण वाले स्ट्रिंग को लौटाता है, या यदि यह स्ट्रिंग छोटी है तो संपूर्ण स्ट्रिंग।

प्रलेखन


1

tl; डॉ

आप ट्रंक करते समय अंतिम स्थान पर एक दीर्घवृत्त ( ) वर्ण के लिए पूछ रहे हैं । आपके इनपुट स्ट्रिंग में हेरफेर करने के लिए यहां एक-लाइनर है।

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 ) + "…";
}

अगर केवल मैं "यदि सीमा से अधिक है, तो इलिप्सिस करें" भाग के साथ स्ट्रीम लाइन डालने का एक तरीका सोच सकता है।


नहीं, स्पष्ट रूप से, वह स्ट्रिंग की लंबाई को ट्रिम करना चाहता है यदि यह 11 या अधिक की लंबाई तक पहुंचता है। आपको
JD333

1
@ JD333 आपकी टिप्पणी मुझसे बच जाती है। दीर्घवृत्त सहित 10 की लंबाई के लिए ट्रंकिंग बिल्कुल वही है जो मैं यहां दिखाता हूं।
बेसिल बॉर्क

0
str==null ? str : str.substring(0, Math.min(str.length(), 10))

या,

str==null ? "" : str.substring(0, Math.min(str.length(), 10))

अशक्त के साथ काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.