জাভাতে কোনও চরকে কোনও চরকে রূপান্তর করার জন্য এটিই কি সঠিক উপায়?


19

booleanদুটি ফাংশন ফিরতে ফাংশনের ইউনিট পরীক্ষা লেখার সময় Stringএবং আমার বর্ণমালার প্রতিটি অক্ষর ( 'a'- 'z') ক্রমানুসারে একের পর এক পরামিতি হিসাবে পরীক্ষা করার প্রয়োজন ছিল , তাই আমি এটি করার জন্য এটি লিখেছিলাম:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

আমি মনে করতাম এটি অনুমতিযোগ্য, তবে এটি ছিল না, সুতরাং আমি কেবল এটির পরিবর্তে এটি করেছি:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

এই একটি নির্ভরযোগ্য পদ্ধতি রূপান্তর করতে হয় charএকটি থেকে Stringজাভা? এটি কি পছন্দসই উপায়? আমি জাভা সম্পর্কে পুরোটা জানি না তাই এ সম্পর্কে কিছু স্পষ্টতা চাই।


2
আপনার প্রশ্নের সরাসরি নয়, তবে আমি করবIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
— এলিয়ট ফ্রিচ

3
@ এলিয়টফ্রিশচ কিন্তু কেন? এখানে স্ট্রিমগুলি অপ্রয়োজনীয়, তবে আপনি যদি প্রতিটি লুপের জন্য স্ট্রিম ব্যবহার করার জন্য জোর দিয়ে থাকেন তবে কমপক্ষে কেন ব্যবহার করবেন না IntStream.rangeClosed('a', 'z')?
— ফিলিপ রোমান

1
কোনও একক 'সঠিক' উপায় নেই। এটি করার জন্য কমপক্ষে পাঁচটি উপায় রয়েছে: যা আপনি চয়ন করেছেন এটি ফ্যাশনের উপর নির্ভর করে যতটা বৈজ্ঞানিক সত্য। বেশিরভাগ সময় এটি সহজভাবে বিবেচনা করে না এবং একটি পরীক্ষা প্রোগ্রাম অবশ্যই এই ক্ষেত্রেগুলির একটি।
— ব্যবহারকারী 207421

@ ফিলিপরোমন কারণ এটি সেখানে রয়েছে (এডমন্ড হিলারি) কারণ আমি পারি কারণ আমরা চাই (বিলি পাইপার, আমি মনে করি)। এটিও একটি দুর্দান্ত পদ্ধতি।
— এলিয়ট ফ্রিচ

আমি ভাবতাম যে এটি জায়েয ছিল আপনি কি ভেবেছিলেন Stringযে কোন কনস্ট্রাক্টরের অস্তিত্ব নেই তার আবেদন করা জায়েয ছিল ? আমি ভুল হলে আমাকে সংশোধন করুন, তবে আমি যতটা অবগত রয়েছি, ক্লাসে Stringএমন কোন নির্মাতা নেই যা একক charযুক্তি গ্রহণ করে। নোট যে charহিসাবে একই নয় char[]।
— আবরা

উত্তর:


32

সংক্ষিপ্ততম সমাধান:

char c = 'a';
String s = "" + c;

সবচেয়ে পরিষ্কার (এবং সম্ভবত সবচেয়ে কার্যকর 1 ) সমাধান:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

আপনার পদ্ধতির তুলনায়, উপরেরটি কোনও Characterবস্তুকে আদিম বাক্স স্থাপন করার ওভারহেডকে বাধা দেয় ।


1 প্রথম পদ্ধতির স্ট্রিং কনটেনটেশনের সামান্য অদক্ষতা সংকলক বা রানটাইম দ্বারা অপ্টিমাইজ করা যেতে পারে, সুতরাং প্রকৃত কর্মক্ষমতা নির্ধারণের জন্য একটি (যদি কেউ এত ঝুঁকে থাকে) সত্যিই একটি মাইক্রো-বেঞ্চমার্ক চালাতে হবে। এর মতো মাইক্রো-অপ্টিমাইজেশানগুলি খুব কমই প্রচেষ্টাটির পক্ষে উপযুক্ত এবং স্ট্রিং রূপান্তরকে বাধ্য করার জন্য দৃ conc়তার উপর নির্ভর করা কেবল খুব সুন্দর দেখাচ্ছে না।


6
গতবার আমি যখন দেখেছি, সনের javacসংকলকটি স্বয়ংক্রিয়ভাবে রূপান্তরিত String s = "" + c;হয়েছে String s = String.valueOf(c);, সুতরাং অভিনয়টি একই হবে।
— নীল

4
নিল হুই! আমি ভাবতে শুরু করেছিলাম যে স্ট্যাক ওভারফ্লোতে আমি যে ধরণের ব্যক্তির লেখা লিখেছিলাম তার কোনও অস্তিত্বই নেই :)
— রবি কর্নেলিসসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.