क्या जावा में स्ट्रिंग को चार्ट में बदलने का यह सही तरीका है?


20

एक फ़ंक्शन के लिए इकाई परीक्षण लिखते समय, 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
@ElliottFrisch लेकिन क्यों? यहां धाराएं अनावश्यक हैं, लेकिन यहां तक ​​कि अगर आप हर लूप के लिए धाराओं का उपयोग करने पर जोर देते हैं, तो कम से कम उपयोग क्यों न करें IntStream.rangeClosed('a', 'z')?
फिलिप्रोमन

1
कोई एक 'सही' तरीका नहीं है। ऐसा करने के लिए कम से कम पांच तरीके हैं: जो आप चुनते हैं वह फैशन पर निर्भर करता है जितना वैज्ञानिक तथ्य। ज्यादातर समय यह बस मायने नहीं रखता है, और एक परीक्षण कार्यक्रम निश्चित रूप से उन मामलों में से एक है।
user207421

@PhilipRoman क्योंकि यह (एडमंड हिलेरी) है। क्योंकि मैं कर सकता हूँ। क्योंकि हम (बिली पाइपर, मुझे लगता है) चाहते हैं। वह भी एक अच्छा तरीका है।
इलियट फ्रिश

मुझे लगता है कि यह अनुमेय था आपको लगता है कि यह एक Stringनिर्माणकर्ता को लागू करने की अनुमति थी जो मौजूद नहीं है? अगर मैं गलत हूं तो मुझे सुधारें, लेकिन जहां तक ​​मेरी जानकारी है, क्लास में कंस्ट्रक्टर नहीं है Stringजो एक ही charतर्क लेता है । ध्यान दें कि charऐसा नहीं है char[]
अब्राहम

जवाबों:


33

सबसे छोटा समाधान:

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

सबसे साफ (और शायद सबसे कुशल 1 ) समाधान:

char c = 'a';

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

आपके दृष्टिकोण की तुलना में, ऊपर एक Characterवस्तु में आदिम बॉक्स करने के लिए उपरि को रोकता है ।


1 पहले दृष्टिकोण में स्ट्रिंग संघनन की थोड़ी सी अक्षमता को कंपाइलर या रनटाइम द्वारा अनुकूलित किया जा सकता है, इसलिए वास्तविक प्रदर्शन को निर्धारित करने के लिए एक (यदि कोई इच्छुक था) वास्तव में एक माइक्रो-बेंचमार्क चलाना होगा। इस तरह के माइक्रो-ऑप्टिमाइज़ेशन शायद ही कभी प्रयास के लायक होते हैं, और स्ट्रिंग रूपांतरण को मजबूर करने के लिए सहमति पर भरोसा करना बहुत अच्छा नहीं लगता है।


6
पिछली बार जब मैंने देखा, सूर्य का javacसंकलक अपने आप बदल String s = "" + c;जाता है String s = String.valueOf(c);, इसलिए प्रदर्शन समान होगा।
नील

4
@ नील व्हीव! मुझे लगने लगा था कि जिस व्यक्ति के बारे में मैंने लिखा है कि स्टैक ओवरफ्लो पर अब फुटनोट मौजूद नहीं है :)
रॉबी कॉर्नेलिसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.