জাভাতে স্প্রিন্টফ সমতুল্য


284

প্রিন্টফ জাভাতে 1.5 টি মুক্তির সাথে যুক্ত হয়েছিল তবে আমি ফাইলের চেয়ে স্ট্রিংয়ে আউটপুট কীভাবে প্রেরণ করব তা খুঁজে পাচ্ছি না (যা স্প্রিন্টফ সি-তে করে)। কেউ কি জানেন, এটা কিভাবে করে?

উত্তর:



28

স্ট্রিংগুলি পরিবর্তনযোগ্য প্রকারের। আপনি এগুলি সংশোধন করতে পারবেন না, কেবল নতুন স্ট্রিং উদাহরণগুলি ফেরত দিন 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" সংশোধন করার চেষ্টা করছি না, আমরা কেবল এটি পরিদর্শন করছি এবং এর দৈর্ঘ্য ফিরিয়ে দিচ্ছি। এটি একটি উদাহরণ পদ্ধতির জন্য নিখুঁত প্রার্থী।

অপরিবর্তনীয় বস্তুগুলিতে তাত্ক্ষণিক পদ্ধতিগুলির জন্য আমার সহজ নিয়ম:

  • যদি আপনাকে একই ধরণের কোনও নতুন উদাহরণ ফেরত আসতে হয়, তবে একটি স্ট্যাটিক পদ্ধতি ব্যবহার করুন।
  • অন্যথায়, একটি উদাহরণ পদ্ধতি ব্যবহার করুন।

4
আমি দেখতে পাচ্ছি যে আপনি কোনওভাবেই ধারণাটি পেয়েছিলেন যে আমি বিন্যাসের স্ট্রিংটি সংশোধন করার পরামর্শ দিচ্ছিলাম। আমি কখনও সম্ভাবনা বিবেচনা করি নি যে কেউ স্ট্রিং পরিবর্তনের আশা করতে পারে, কারণ তাদের অপরিবর্তনীয়তা এতটা মৌলিক।
এরিকসন

4
ফর্ম্যাট স্ট্রিংটি সাধারণত "দাম% 4 ডি" এর মতো হয় এবং "% 4 ডি" নয়, আমি এখনও বিভ্রান্তির অনেক সম্ভাবনা দেখতে পাচ্ছি। স্থির পদ্ধতির বিরুদ্ধে আপনার কী আছে? :)
ফ্লাইওয়াত

44
এই উত্তরটির সাথে এই প্রশ্নের কোনও যোগসূত্র নেই বলে মনে হচ্ছে।
স্টিভ ম্যাকলিড

2
উত্তরটি
জাভাও নয়

3
-1। ডাউনভোটেড বি / সি এটি স্পর্শকাতর। এবং অপরিবর্তনীয় জন্য সর্বোত্তম স্টাইল অগত্যা নয়। সাধারণ পদ্ধতি কলগুলির চেয়ে এই শৈলীটি আরও ভার্বোজ, বিশেষত শিকলযুক্ত ক্রিয়াকলাপগুলির জন্য। এবং এটি রান-টাইম পলিমারফিজম ছেড়ে দেয় কারণ এটি স্ট্যাটিক পদ্ধতিগুলি কল করে যা তাৎপর্যপূর্ণ। YMMV।
অ্যান্ড্রু জান্কে

3

দুটি সমাধানই প্রিন্টফের অনুকরণ করে তবে ভিন্নভাবে 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)));
    ...

... তবে তা সত্যিই কুৎসিত হবে।


সমস্ত দুর্দান্ত ধারণা, তবে আপনার কোডটি আপনার সহকর্মীর পক্ষে বুঝতে পারা অসম্ভব লিখিত কোডে পরিণত করে।
বেন

0

আপনি মুদ্রণযন্ত্রের সাথে আউটপুট স্ট্রিমের যে কোনও কিছুতে প্রিন্টফ করতে পারেন। একরকম, স্ট্রিং স্ট্রিমে মুদ্রণ করা:

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