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


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.