প্রিন্টফ জাভাতে 1.5 টি মুক্তির সাথে যুক্ত হয়েছিল তবে আমি ফাইলের চেয়ে স্ট্রিংয়ে আউটপুট কীভাবে প্রেরণ করব তা খুঁজে পাচ্ছি না (যা স্প্রিন্টফ সি-তে করে)। কেউ কি জানেন, এটা কিভাবে করে?
প্রিন্টফ জাভাতে 1.5 টি মুক্তির সাথে যুক্ত হয়েছিল তবে আমি ফাইলের চেয়ে স্ট্রিংয়ে আউটপুট কীভাবে প্রেরণ করব তা খুঁজে পাচ্ছি না (যা স্প্রিন্টফ সি-তে করে)। কেউ কি জানেন, এটা কিভাবে করে?
উত্তর:
// Store the formatted string in 'result'
String result = String.format("%4d", i * j);
// Write the result to standard output
System.out.println( result );
স্ট্রিংগুলি পরিবর্তনযোগ্য প্রকারের। আপনি এগুলি সংশোধন করতে পারবেন না, কেবল নতুন স্ট্রিং উদাহরণগুলি ফেরত দিন return
তার কারণ হিসাবে, একটি উদাহরণ পদ্ধতিতে ফর্ম্যাট করা কিছুটা অর্থপূর্ণ হয় না, কারণ এটির মতো বলা যেতে পারে:
String formatted = "%s: %s".format(key, value);
আসল জাভা লেখক (এবং। নেট লেখক) সিদ্ধান্ত নিয়েছিলেন যে কোনও স্থির পদ্ধতি এই পরিস্থিতিতে আরও তাত্পর্যপূর্ণ হয়েছে, যেহেতু আপনি লক্ষ্য পরিবর্তন করছেন না, পরিবর্তে ফর্ম্যাট পদ্ধতিটি কল করে ইনপুট স্ট্রিংয়ে যাচ্ছেন।
format()
উদাহরণস্বরূপ পদ্ধতিটি কেন বোবা হবে তার একটি উদাহরণ এখানে । .NET (এবং সম্ভবত জাভাতে), Replace()
একটি উদাহরণ পদ্ধতি।
তুমি এটি করতে পারো:
"I Like Wine".Replace("Wine","Beer");
যাইহোক, কিছুই ঘটে না, কারণ স্ট্রিংগুলি অবিচ্ছেদ্য। Replace()
একটি নতুন স্ট্রিং ফেরত দেওয়ার চেষ্টা করে, তবে এটি কিছুই দেওয়া হয় না।
এর ফলে প্রচুর প্রচলিত ছদ্মবেশী ভুল ঘটে:
inputText.Replace(" ", "%20");
আবার, কিছুই ঘটে না, পরিবর্তে আপনাকে করতে হবে:
inputText = inputText.Replace(" ","%20");
এখন, যদি আপনি বুঝতে পারেন যে স্ট্রিংগুলি অপরিবর্তনীয়, তবে এটি সঠিক ধারণা দেয়। যদি তা না করেন তবে আপনি কেবল বিভ্রান্ত হয়ে পড়েছেন। এর স্থির পদ্ধতি হিসাবে যথাযথ স্থানটি Replace()
যেখানে হবে :format()
String
inputText = String.Replace(inputText, " ", "%20");
এখন কী চলছে তা নিয়ে প্রশ্ন নেই।
আসল প্রশ্নটি হচ্ছে, এই কাঠামোর লেখকরা কেন সিদ্ধান্ত নিলেন যে একটি উদাহরণ পদ্ধতি এবং অন্যটি স্থিতিশীল হওয়া উচিত? আমার মতে, উভয়ই স্থির পদ্ধতি হিসাবে আরও মার্জিতভাবে প্রকাশিত হয়।
আপনার মতামত নির্বিশেষে, সত্যটি হ'ল আপনি স্থির সংস্করণ ব্যবহার করে ভুল করার প্রবণতা কম এবং কোডটি বোঝা আরও সহজ (কোনও আড়াল করা নেই)।
অবশ্যই কিছু পদ্ধতি রয়েছে যা উদাহরণ পদ্ধতি হিসাবে নিখুঁত, স্ট্রিং নিন en লেন্থ ()
int length = "123".Length();
এই পরিস্থিতিতে, এটি সুস্পষ্ট যে আমরা "123" সংশোধন করার চেষ্টা করছি না, আমরা কেবল এটি পরিদর্শন করছি এবং এর দৈর্ঘ্য ফিরিয়ে দিচ্ছি। এটি একটি উদাহরণ পদ্ধতির জন্য নিখুঁত প্রার্থী।
অপরিবর্তনীয় বস্তুগুলিতে তাত্ক্ষণিক পদ্ধতিগুলির জন্য আমার সহজ নিয়ম:
দুটি সমাধানই প্রিন্টফের অনুকরণ করে তবে ভিন্নভাবে way উদাহরণস্বরূপ, একটি মানকে হেক্স স্ট্রিংয়ে রূপান্তর করতে আপনার কাছে নিম্নলিখিত দুটি সমাধান রয়েছে:
সাথে format()
, নিকটতম sprintf()
:
final static String HexChars = "0123456789abcdef";
public static String getHexQuad(long v) {
String ret;
if(v > 0xffff) ret = getHexQuad(v >> 16); else ret = "";
ret += String.format("%c%c%c%c",
HexChars.charAt((int) ((v >> 12) & 0x0f)),
HexChars.charAt((int) ((v >> 8) & 0x0f)),
HexChars.charAt((int) ((v >> 4) & 0x0f)),
HexChars.charAt((int) ( v & 0x0f)));
return ret;
}
সহ replace(char oldchar , char newchar)
, কিছুটা দ্রুত তবে বেশ সীমাবদ্ধ:
...
ret += "ABCD".
replace('A', HexChars.charAt((int) ((v >> 12) & 0x0f))).
replace('B', HexChars.charAt((int) ((v >> 8) & 0x0f))).
replace('C', HexChars.charAt((int) ((v >> 4) & 0x0f))).
replace('D', HexChars.charAt((int) ( v & 0x0f)));
...
একটি করে চারটি যুক্ত করে একটি তৃতীয় সমাধান রয়েছে ret
(চরগুলি এমন একটি সংখ্যা যা একে অপরের সাথে যুক্ত হয় !) যেমন:
...
ret += HexChars.charAt((int) ((v >> 12) & 0x0f)));
ret += HexChars.charAt((int) ((v >> 8) & 0x0f)));
...
... তবে তা সত্যিই কুৎসিত হবে।
আপনি মুদ্রণযন্ত্রের সাথে আউটপুট স্ট্রিমের যে কোনও কিছুতে প্রিন্টফ করতে পারেন। একরকম, স্ট্রিং স্ট্রিমে মুদ্রণ করা:
PrintStream ps = new PrintStream(baos);
ps.printf("there is a %s from %d %s", "hello", 3, "friends");
System.out.println(baos.toString());
baos.reset(); //need reset to write new string
ps.printf("there is a %s from %d %s", "flip", 5, "haters");
System.out.println(baos.toString());
baos.reset();
স্ট্রিং স্ট্রিমটি এই বাইটআর্যআউটপুট স্ট্রিমের মতো তৈরি করা যেতে পারে:
ByteArrayOutputStream baos = new ByteArrayOutputStream();