java - मेरे अक्षरों को+के साथ जोड़ने के बाद मेरे स्ट्रिंग अक्षर के बजाय इंटेगर में क्यों बदल जाते हैं?




string (4)

इस सवाल का पहले से ही यहाँ एक जवाब है:

तो यह कार्य है: एक स्ट्रिंग को देखते हुए, एक स्ट्रिंग वापस करें जहां मूल में प्रत्येक वर्ण के लिए, दो वर्ण हैं।

और मुझे समझ नहीं आ रहा है कि इसके आउटपुट अक्षरों के बजाय संख्याएँ क्यों हैं, मैंने कोशिश की कि यह काम नहीं करता?

public String doubleChar(String str) {
  String s = "";
  for(int i=0; i<str.length(); i++){
  s +=  str.charAt(i) + str.charAt(i);

  }
    return s;
}

अपेक्षित होना :

DoubleChar ("द") → "टीथे"

DoubleChar ("AAbb") → "AAAAbbb"

आउटपुट:

डबलचेयर ("द") → "168208202"

डबलचहर ("एएबीबी") → "130130196196"


यह पूर्णांक क्यों आउटपुट करता है?

+ ऑपरेटर को String एस के लिए केवल String एस का उपयोग करने के लिए जावा में ओवरलोड किया गया है, न कि char एस।

जावा युक्ति से :

यदि + ऑपरेटर के किसी भी प्रकार का स्ट्रिंग स्ट्रिंग है, तो ऑपरेशन स्ट्रिंग समवर्ती है।

अन्यथा, प्रत्येक ऑपरेटर का प्रकार + ऑपरेटर का एक प्रकार होना चाहिए जो एक आदिम संख्यात्मक प्रकार के लिए परिवर्तनीय (.15.1.8) है, या एक संकलन-समय त्रुटि उत्पन्न होती है।

आपके मामले में, char को इसके आदिम मान (int) में बदल दिया जाता है, फिर जोड़ा जाता है।

इसके बजाय, उन्हें String में बदलने के लिए StringBuilder.append(char) का उपयोग करें।

यदि प्रदर्शन चिंता का विषय नहीं है, तो आप भी कर सकते हैं:

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

और s += "" + c + c;

यह + String संघनन ऑपरेटर को मजबूर करेगा क्योंकि यह एक String ("") से शुरू होता है। ऊपर जावा कल्पना उदाहरण के साथ समझाती है:

+ ऑपरेटर वाक्यात्मक रूप से बाएं-साहचर्य है, कोई फर्क नहीं पड़ता कि क्या यह स्ट्रिंग विश्लेषण या संख्यात्मक जोड़ का प्रतिनिधित्व करने के लिए प्रकार विश्लेषण द्वारा निर्धारित किया जाता है। कुछ मामलों में वांछित परिणाम प्राप्त करने के लिए देखभाल की आवश्यकता होती है। उदाहरण के लिए [...]

1 + 2 + " fiddlers" "3 fiddlers"

लेकिन इसका परिणाम:

"fiddlers " + 1 + 2 "fiddlers 12"


आप एक साथ दो वर्णों का मान जोड़ रहे हैं। String संघनन को इसमें से बदलें:

s +=  str.charAt(i) + str.charAt(i);

सेवा मेरे:

s +=  str.charAt(i) + "" + str.charAt(i);

जो पात्रों को एक String परिवर्तित करना सुनिश्चित करेगा।

नोट: यह एक त्वरित समाधान है, और आपको String उपयोग करना चाहिए जब String एक लूप के अंदर StringBuilder करता है। यह कैसे किया जाता है, इसके अन्य उत्तर देखें।


जावा में char प्रकार के वर्णिक प्रकार मूल रूप से केवल एक संख्यात्मक मान है जो किसी वर्ण के लिए मैप करते हैं, इसलिए यदि आप दो char मानों को एक साथ जोड़ते हैं तो वे एक संख्या का उत्पादन करते हैं न कि एक और char (और एक String नहीं) इसलिए आप एक int साथ समाप्त होते हैं ' फिर से देख रहा हूँ

इसे ठीक करने के लिए आप इस तरह से Character.toString(char) विधि का उपयोग कर सकते हैं:

s += Character.toString(str.charAt(i)) + Character.toString(str.charAt(i))

लेकिन यह सब काफी अक्षम है क्योंकि आप इसे एक लूप में कर रहे हैं और इसलिए स्ट्रिंग कंजेशन बहुत अधिक String वस्तुओं का अनावश्यक रूप से उत्पादन कर रहा है। अधिक कुशल इस तरह से एक StringBuilder और उसके append(char) विधि का उपयोग करने के लिए है:

StringBuilder sb = new StringBuilder(str.length() * 2);
for (int i = 0; i < str.length(); ++i) {
    char c = str.charAt(i);
    sb.append(c).append(c);
}
return sb.toString();

String.charAt() एक char ( https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int) ) ताकि आप किसी एकल वर्ण के साथ काम कर रहे हों। एक char साथ, आप इस पर इस तरह से ऑपरेशन कर सकते हैं (जो "65" प्रिंट करेगा जो कि 'ए' वर्ण) के लिए एएससीआईआई मान है:

System.out.println('A' + 0);

आप इस तरह से 1 'A' जोड़कर अगले चरित्र ("बी") के लिए एएससीआईआई मूल्य प्रिंट कर सकते हैं:

System.out.println('A' + 1);

अपने कोड को काम करने के लिए - ताकि यह प्रत्येक चरित्र को दोगुना कर दे - विकल्पों की संख्या है। आप प्रत्येक वर्ण को एक बार में जोड़ सकते हैं:

s += str.charAt(i);
s += str.charAt(i);

या स्ट्रिंग को ऑपरेशन के विभिन्न तरीके:

s += "" + str.charAt(i) + str.charAt(i);




string