স্ট্রিং দৈর্ঘ্যের উপর ভিত্তি করে একটি স্ট্রিং ট্রিম করুন


136

দৈর্ঘ্য 10 টি অক্ষরের বেশি হলে আমি একটি স্ট্রিং ছাঁটাতে চাই।

ধরুন যদি স্ট্রিংয়ের দৈর্ঘ্য 12 ( String s="abcdafghijkl") হয় তবে নতুন ছাঁটাইযুক্ত স্ট্রিংটি থাকবে "abcdefgh.."

আমি কীভাবে এটি অর্জন করতে পারি?



এফওয়াইআই, একটি আধ্যাত্মিক এলিপসিস একটি একক চরিত্র, দুটি বা তিনটি সম্পূর্ণ স্টপ অক্ষর নয়:…
বেসিল বার্ক

উত্তর:


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

Math.minস্ট্রিং ইতিমধ্যে সংক্ষিপ্ততর হ'ল ক্ষেত্রে এই জাতীয় ব্যবহার ব্যতিক্রম এড়ায় 10


মন্তব্য:

  1. উপরোক্ত বাস্তব ট্রিমিং করে। যদি আপনি প্রকৃতপক্ষে শেষের তিনটি (!) অক্ষরগুলি সংক্ষিপ্ত আকারে প্রতিস্থাপন করতে চান তবে অ্যাপাচি কমন্স ব্যবহার করুন StringUtils.abbreviate

  2. এই ভুল আচরণ করতে পারে 1 যদি আপনার স্ট্রিং বিএমপি বাইরে ইউনিকোড codepoints উপস্থিত রয়েছে; যেমন ইমোজিস। এমন একটি (আরও জটিল) সমাধানের জন্য যা সমস্ত ইউনিকোড কোড-পয়েন্টের জন্য সঠিকভাবে কাজ করে, দেখুন @ সিবনিকের সমাধান


1 - একটি ইউনিকোড কোডপয়েন্ট যা বিমানে 0 (বিএমপি) তে নেই এবং এর মধ্যে একটি "সারোগেট জুড়ি" (অর্থাত্ দুটি charমান) হিসাবে উপস্থাপিত হয় String। এটিকে উপেক্ষা করে আমরা 10 টিরও কম কোড পয়েন্টে ট্রামকেট করতে পারি বা একটি সার্গেট জুটির মাঝখানে (আরও খারাপ) কেটে দেব। অন্যদিকে String.length(), ইউনিকোড পাঠ্য দৈর্ঘ্যের আদর্শ মাপ আর নয়, সুতরাং এর উপর ভিত্তি করে ছাঁটাই করা ভুল কাজ হতে পারে।


ম্যাথ.মিনের পরিবর্তে আমরা একটি শর্তসাপেক্ষ চেক করতে পারি না এবং স্ট্রিংগুলি কেবল তখন স্ট্রিংয়ের প্রয়োজন হলেই করতে পারি? যেমন:s = (s.length() > 10) ? s.substring(0,10) : s ;
rram

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
@ স্টেফেনসি - প্রশ্নটি 8 টি অক্ষর অনুসরণ করে 2 টি বিন্দু, 10 এর দৈর্ঘ্যের সীমা দেওয়া, যা অনেকটা উপবৃত্তের মতো (3 এর চেয়ে মাত্র 2 টি বিন্দু)। এটি সম্ভবত সম্ভবত এই প্রশ্নটি খুঁজে পাওয়া লোকদের বেশিরভাগই উপবৃত্তিকে দরকারী বলে বিবেচনা করবে।
স্টেভ

12
... এবং যদি আপনি উপবৃত্তটি না চান তবে স্ট্রিংইটিলস.ফেল্ট () আপনাকে সহায়তা করতে পারে।
সুপারল

1
এফওয়াইআই, একটি আধ্যাত্মিক এলিপ্পিস একটি একক চরিত্র, তিনটি পুরো স্টপ অক্ষর নয়:…
বেসিল বার্ক

53

একটি অ্যাপাচি কমন্স StringUtilsফাংশন রয়েছে যা এটি করে।

s = StringUtils.left(s, 10)

যদি লেন বর্ণগুলি উপলভ্য না থাকে বা স্ট্রিংটি শূন্য থাকে তবে স্ট্রিংটি ব্যতিক্রম ছাড়াই ফিরে আসবে। লেনটি নেতিবাচক হলে একটি খালি স্ট্রিং ফিরে আসে।

StringUtils.left (নাল, ) = নাল
StringUtils.left (
, -ve) = ""
StringUtils.left ("", *) = ""
স্ট্রিংইটিলস.ফেল্ট ("abc", 0) = ""
স্ট্রিংউটিলস.লেফ্ট (" abc ", 2) =" ab "
স্ট্রিংইটিলস.লেফ্ট (" abc ", 4) =" এবিসি "

স্ট্রিংউটিলস। বাম জাভাডোকস

সৌজন্যে: স্টিভ ম্যাককুলি


22

যথারীতি কেউ ইউটিএফ -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)

এই স্ট্রিং থেকে প্রথম এন অক্ষর যুক্ত স্ট্রিং বা এই স্ট্রিংটি যদি সংক্ষিপ্ত হয় তবে পুরো স্ট্রিংটি দেয়।

নথিপত্র


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 এবং তার পরে। আকর্ষণীয়, তবে সেরা পদ্ধতির নাও হতে পারে।

আমরা মানগুলির চেয়ে কোড পয়েন্ট ব্যবহার করি charcharটাইপ উত্তরাধিকার, এবং সীমাবদ্ধ একটি উপসেট সব সম্ভব ইউনিকোড অক্ষর।

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 বা তার বেশি দৈর্ঘ্যে ছাঁটাই করতে চান। আপনার অবশ্যই একটি নতুন এআই সিস্টেমে কাজ করা উচিত
জেডি 333

1
@ জেডি 333 আপনার মন্তব্য আমাকে ছেড়ে যায়। উপবৃত্তাসহ 10 টি দৈর্ঘ্যে ছাঁটাই হচ্ছে আমি এখানে যা দেখছি ঠিক তেমনই।
বেসিল Bourque

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

বা,

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

নাল দিয়ে কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.