আকার পরীক্ষা না করে বা সীমা ছাড়াই আমি স্ট্রিংয়ের প্রথম এন অক্ষরগুলি কীভাবে পেতে পারি?


162

nজাভাতে কোনও স্ট্রিংয়ের প্রথম অক্ষরগুলি কীভাবে আমি প্রথমে একটি আকার চেক না করে করব (ইনলাইন গ্রহণযোগ্য) বা ঝুঁকি নিয়ে IndexOutOfBoundsException?


1
আপনি যদি ব্যতিক্রমটি না ধরেন, আমি জানি না আপনি কীভাবে অক্ষরের দৈর্ঘ্যের চেয়ে অক্ষরের দৈর্ঘ্য বেশি সেই কেসটি পরিচালনা করবেন।
ম্যাট বোহেম

2
কেন? দৈর্ঘ্য যাচাই বা একটি ব্যতিক্রম ধরা আপনার বিরক্তি কী?
paxdiablo

1
কৌতূহল হ'ল, আপনি কেন আকার চেক এড়াতে চান। এটি সি নয়
টম হাটিন -

আমি যা বোঝাতে চেয়েছি তা হ'ল যদি / অন্য অবরুদ্ধ হওয়া এড়ানোর আকাঙ্ক্ষা ছিল তবে প্রকৃতপক্ষে দৈর্ঘ্য পরীক্ষা করার বিপর্যয় ছিল না।
antony.trupe

এর সম্ভাব্য সদৃশ: স্ট্যাকওভারফ্লো.com
৮৪৯৯৯

উত্তর:


346

এখানে একটি ঝরঝরে সমাধান:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

মতামত: যদিও এই দ্রবণটি "ঝরঝরে", তবুও আমি মনে করি এটি প্রকৃতপক্ষে / যেভাবে ব্যবহার করা হয় তার চেয়ে কম সমাধানযোগ্য । পাঠক যদি এই কৌশলটি না দেখেন তবে কোড বোঝার জন্য তাকে আরও কঠিন চিন্তা করতে হবে। আইএমও, কোডটির অর্থ / সংস্করণে আরও স্পষ্ট । ক্লিনার / আরও পঠনযোগ্য সমাধানের জন্য, @ প্যাক্সডিয়াবলোর উত্তর দেখুন।ifelseifelse


1
+1 টি। আরও ভাল যদি এটি প্যাক্সিয়াবলোর জবাবের মতো Safe_substring বা সাবস্ট্রিং_সেফ নামের একটি ফাংশনে আবৃত থাকে, যাতে ব্যবহারটি আরও স্পষ্টভাবে পড়তে / অভিপ্রায় করা সহজ হয়।
টুলমেকারস্টেভ

আপনি যা বলছেন তাতে আমি একমত নই। এটি যদি কোনও ফাংশনে আবৃত থাকে তবে ফাংশনের অভ্যন্তরে কী তা বিচার্য আসে না এবং কোনও "ঝরঝরে" স্পষ্টতার অভাবের দ্বারা অবশ্যই খুব বেশি ওজনযুক্ত। এই সমাধানের বিষয়টি হ'ল এটি যে আপনি একটি মোড়ক ফাংশন তৈরি করতে চান না সেই ক্ষেত্রে এটি "ঝরঝরে" ।
স্টিফেন সি

88

চাকা পুনরায় উদ্ভাবন করবেন না ...:

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"

1
এটি প্রশ্নের উত্তর দেয় না, তবে এটি এখনও সমাধান সরবরাহ করে। ওপি যদি বুঝতে সক্ষম হয় তবে আমি মনে করি এটি আরও ভাল সমাধান।
আউল্লাহ

5
এটি StringUtils.substring(yourString, 0, n)একইরকম নয় তা উল্লেখ করাও কার্যকর হতে পারে yourString.substring(0, n)। পূর্ববর্তীটি হ'ল StringUtils, দ্বিতীয়টি যখন ব্যবহার করছেন String.substring(যা শেষ সূচকটি স্ট্রিং দৈর্ঘ্যের চেয়ে বেশি হলে ব্যতিক্রম দেয়)।
স্টেভ

ঠিক যেমন FYI আপনি যদি এই পদ্ধতির উত্সটি দেখেন তবে এটির ক্ষেত্রে যে if (end > str.length()) { end = str.length();}
প্রান্তটি

1
সর্বশেষ প্যারামিটারটি StringUtils.substring(String s, int start, int len)লেন নয়, এটি শেষ সূচক।
গুরুটদে

StringUtils.substring ("abc", 0, 4) = "abc", আমার পক্ষে কাজ করেছিল। ধন্যবাদ!
আকাশ5288

42

অ্যাপাচি কমন্স ল্যাং এর জন্য একটি StringUtils.leftপদ্ধতি রয়েছে ।

String upToNCharacters = StringUtils.left(s, n);

এটি কি সেরা সমাধান হওয়া উচিত নয়? কেন অনেক আপ-ভোটিং হয় না?
কি করতে হবে

3
কারণ অন্য লোকের মত আপনার মতামত নেই? :-)
স্টিফেন সি

এই উত্তরটি আসল প্রশ্ন জিজ্ঞাসার তারিখের চেয়ে অনেক পরে এসেছিল।
মুলকি

@ ডুইল: কারণ আপনার কার্যকর পরিবেশে একটি (অন্যান্য) তৃতীয় পক্ষের লাইব্রেরি যুক্ত করা সর্বদা সার্থক নয়।
LarsH

12

এসও তে এক শ্রেণির প্রশ্ন রয়েছে যা কখনও কখনও নিখুঁত জ্ঞানের চেয়ে কম করে তোলে, এইটি বিপজ্জনকভাবে নিকটে :-)

আপনি যে দুটি পদ্ধতির বিষয়টি অস্বীকার করেছেন তার মধ্যে একটির ব্যবহার সম্পর্কে আপনি সম্ভবত নিজের বিদ্বেষকে ব্যাখ্যা করতে পারেন।

যদি আপনি কেবল কোডটি ifবিবৃতি বা ব্যতিক্রমী কোডিং কোডের সাথে মরিচ না চান তবে এটির একটি সমাধান হ'ল একটি সহায়ক ফাংশন ব্যবহার করা যা এটি আপনার যত্ন নেবে, যেমন:

static String substring_safe (String s, int start, int len) { ... }

যা আগে আগে দৈর্ঘ্য পরীক্ষা করে এবং সে অনুযায়ী কাজ করবে (হয় ছোট স্ট্রিং বা স্পেস সহ প্যাড ফেরত দেয়)।

তারপরে আপনার কোডটিতে এটি নিয়ে কোনও চিন্তা করার দরকার নেই, কেবল কল করুন:

String s2 = substring_safe (s, 10, 7);

পরিবর্তে:

String s2 = s.substring (10,7);

এটি এমন ক্ষেত্রে কাজ করবে যে আপনি প্রচুর স্ট্রিং বিল্ডিং স্টাফ করার সময় কোডটির প্রবাহকে ভঙ্গ করবেন না (অন্যান্য উত্তরের উপর আপনার মন্তব্যের ভিত্তিতে) উদ্বিগ্ন বলে মনে হচ্ছে।


1
আপনার মন্তব্যটি আরও ঘনিষ্ঠভাবে পড়া উচিত, @ অ্যান্টনি, বিশেষত স্মাইলি এবং যারা সাহায্যের চেষ্টা করছেন তাদের সম্পর্কে এত মূল্যবান হওয়া উচিত নয়। আমি কেবল বলছিলাম যে কেন আপনি দুটি পদ্ধতি এড়িয়ে চলেন সে সম্পর্কে কোনও যুক্তি আপনি দেননি। এবং এটি একটি খাঁটি উত্তর, কোনও সহায়ক ফাংশন ব্যবহার করে, কেন এটি কোনও মন্তব্যে নেই।
প্যাক্সিডিয়াবলো

1
+1: কোডটি বিশৃঙ্খলা না করার ওপির ইচ্ছা অনুসারে এটি স্বীকৃত ব্যক্তির চেয়ে অনেক বেশি ভাল পদ্ধতির। (অথবা নিক্কের একটি লাইব্রেরি যা ইতিমধ্যে পছন্দসই হিসাবে আচরণ করে এমন একটি লাইব্রেরি অন্তর্ভুক্ত করার সমাধান দেখুন
টুলমেকারস্টেভ

12
String upToNCharacters = String.format("%."+ n +"s", str);

nভেরিয়েবল হলে ভয়াবহ (তাই আপনাকে অবশ্যই ফরম্যাটের স্ট্রিংটি তৈরি করতে হবে) তবে ধ্রুবক হলে বেশ পরিষ্কার:

String upToNCharacters = String.format("%.10s", str);

ডক্স


আকর্ষণীয় বিকল্প, যদিও আমি এটি কখনও ব্যবহারের কল্পনা করতে পারি না, আরও traditionalতিহ্যগত পদ্ধতির দিক দিয়ে, যা চার বছর আগে দেওয়া হয়েছিল।
টুলমেকারস্টেভ

সর্বোত্তম উত্তর কারণ ইনপুট স্ট্রিংটি কেবল একবারই পঠিত হয়, সুতরাং এটির কোনও ভেরিয়েবলে সংরক্ষণ করার দরকার নেই যা এটি পরিষ্কার করে এম্বেড করা সম্ভব করে।
প্রোফিটরোল

3

সাবস্ট্রিং পদ্ধতিটি নিম্নরূপ ব্যবহার করুন:

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

যদি এন স্ট্রিংয়ের দৈর্ঘ্যের চেয়ে বেশি হয় তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে, যেমন একজন মন্তব্যকারী উল্লেখ করেছেন। একটি সহজ সমাধান হ'ল এটিকে if(s.length()<n)আপনার elseদফায় শর্তে মোড়ানো , আপনি কেবল পুরো স্ট্রিংটি মুদ্রণ / ফিরিয়ে দিতে চান বা এটি অন্যভাবে পরিচালনা করতে চান তা চয়ন করতে পারেন।


1
এই ঝুঁকিটি সূচক
ছাড়াই

যাইহোক, আপনি যদি জাভাতে প্রোগ্রামিং করার পরিকল্পনা করেন, আপনার স্ট্রিংয়ের জন্য বেশিরভাগ এপিআই পদ্ধতি মুখস্থ করার চেষ্টা করা উচিত ( java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html )।
ম্যাট বোহেম

আমি ইতিমধ্যে সাবস্ট্রিং বাতিল করেছি, কমপক্ষে নিজে থেকেই, উত্তর হিসাবে নয়
antony.trupe

আপনাকে হয় আকার পরীক্ষা করতে হবে বা ব্যতিক্রমটি ধরতে হবে। আমি জিজ্ঞাসা করতে পারি যে এর মধ্যে দুটিও করা আপনার পরিস্থিতিতে কাজ করবে না?
ম্যাট বোহেম

3
এটি প্রশ্নের উত্তর কীভাবে? প্রশ্নটি জিজ্ঞাসা করছিল যে কীভাবে প্রথমে একটি আকার চেক করতে হবে না, বা যে ব্যতিক্রম ধরা পড়তে হবে তার কারণও নয়।
নির্মাতা স্টিভ

3

আপনি যদি কোটলিনের সাথে বিকাশের জন্য যথেষ্ট ভাগ্যবান হন তবে আপনি নিজের লক্ষ্য অর্জনে
ব্যবহার করতে পারেন take

val someString = "hello"

someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))

0

অ্যাপাচিকমন্স আমাকে অবাক করেছে, 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;
}

1
@ ভোলকানগেভেন এই "অ্যাপাচি কমন্স আমাকে অবাক করে দিয়েছে" বাক্যটির কারণে। আমি পবিত্র অ্যাপাচিকমন্স লাইব্রেরির সমালোচনা করে পাপ করেছি। বা যাই হোক না কেন ...
ইউসিল

0

কোটলিন: (কারও যদি প্রয়োজন হয়)

var mText = text.substring(0, text.length.coerceAtMost(20))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.