দৈর্ঘ্য 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 যদি আপনার স্ট্রিং বিএমপি বাইরে ইউনিকোড codepoints উপস্থিত রয়েছে; যেমন ইমোজিস। এমন একটি (আরও জটিল) সমাধানের জন্য যা সমস্ত ইউনিকোড কোড-পয়েন্টের জন্য সঠিকভাবে কাজ করে, দেখুন @ সিবনিকের সমাধান ।
1 - একটি ইউনিকোড কোডপয়েন্ট যা বিমানে 0 (বিএমপি) তে নেই এবং এর মধ্যে একটি "সারোগেট জুড়ি" (অর্থাত্ দুটি 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 (নাল, ) = নাল
StringUtils.left ( , -ve) = ""
StringUtils.left ("", *) = ""
স্ট্রিংইটিলস.ফেল্ট ("abc", 0) = ""
স্ট্রিংউটিলস.লেফ্ট (" abc ", 2) =" ab "
স্ট্রিংইটিলস.লেফ্ট (" abc ", 4) =" এবিসি "
সৌজন্যে: স্টিভ ম্যাককুলি
যথারীতি কেউ ইউটিএফ -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)
এই স্ট্রিং থেকে প্রথম এন অক্ষর যুক্ত স্ট্রিং বা এই স্ট্রিংটি যদি সংক্ষিপ্ত হয় তবে পুরো স্ট্রিংটি দেয়।
মনে হচ্ছে আপনি সঙ্কুচিত… হওয়ার সময় শেষ স্থানে একটি উপবৃত্ত ( ) অক্ষর চাইছেন । আপনার ইনপুট স্ট্রিংটি পরিচালনা করার জন্য এখানে একটি ওয়ান-লাইনার রয়েছে।
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 ) + "…";
}
কেবল যদি আমি স্ট্রিম লাইনটিকে "যদি সীমা ছাড়াই, উপবৃত্তটি করি" অংশের সাথে একত্রে রাখার উপায় সম্পর্কে ভাবতে পারি।