n
জাভাতে কোনও স্ট্রিংয়ের প্রথম অক্ষরগুলি কীভাবে আমি প্রথমে একটি আকার চেক না করে করব (ইনলাইন গ্রহণযোগ্য) বা ঝুঁকি নিয়ে IndexOutOfBoundsException
?
n
জাভাতে কোনও স্ট্রিংয়ের প্রথম অক্ষরগুলি কীভাবে আমি প্রথমে একটি আকার চেক না করে করব (ইনলাইন গ্রহণযোগ্য) বা ঝুঁকি নিয়ে IndexOutOfBoundsException
?
উত্তর:
এখানে একটি ঝরঝরে সমাধান:
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
মতামত: যদিও এই দ্রবণটি "ঝরঝরে", তবুও আমি মনে করি এটি প্রকৃতপক্ষে / যেভাবে ব্যবহার করা হয় তার চেয়ে কম সমাধানযোগ্য । পাঠক যদি এই কৌশলটি না দেখেন তবে কোড বোঝার জন্য তাকে আরও কঠিন চিন্তা করতে হবে। আইএমও, কোডটির অর্থ / সংস্করণে আরও স্পষ্ট । ক্লিনার / আরও পঠনযোগ্য সমাধানের জন্য, @ প্যাক্সডিয়াবলোর উত্তর দেখুন।if
else
if
else
চাকা পুনরায় উদ্ভাবন করবেন না ...:
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);
যদি এন স্ট্রিংয়ের দৈর্ঘ্যের চেয়ে বেশি হয় তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে, যেমন একজন মন্তব্যকারী উল্লেখ করেছেন। একটি সহজ সমাধান হ'ল এটিকে if(s.length()<n)
আপনার else
দফায় শর্তে মোড়ানো , আপনি কেবল পুরো স্ট্রিংটি মুদ্রণ / ফিরিয়ে দিতে চান বা এটি অন্যভাবে পরিচালনা করতে চান তা চয়ন করতে পারেন।
আপনি যদি কোটলিনের সাথে বিকাশের জন্য যথেষ্ট ভাগ্যবান হন তবে আপনি নিজের লক্ষ্য অর্জনে
ব্যবহার করতে পারেন take
।
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
অ্যাপাচিকমন্স আমাকে অবাক করেছে,
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;
}