सूचकांक द्वारा स्ट्रिंग चरित्र प्राप्त करें - जावा


230

मुझे पता है कि एक स्ट्रिंग में एक निश्चित चरित्र या संख्या के सूचकांक को कैसे काम करना है, लेकिन क्या कोई पूर्वनिर्धारित विधि है जो मैं चरित्र को nth स्थिति में देने के लिए उपयोग कर सकता हूं ? तो स्ट्रिंग "फू" में, अगर मैंने इंडेक्स 0 वाले चरित्र के लिए कहा तो यह "एफ" वापस आ जाएगा।

नोट - उपरोक्त प्रश्न में, "चरित्र" से मेरा मतलब चार डेटा प्रकार नहीं है, लेकिन एक पत्र या संख्या एक स्ट्रिंग में है। यहां महत्वपूर्ण बात यह है कि विधि लागू होने पर मुझे एक चार्ट प्राप्त नहीं होता है, लेकिन एक स्ट्रिंग (लंबाई 1)। और मुझे सबस्ट्रिंग () विधि के बारे में पता है, लेकिन मैं सोच रहा था कि क्या कोई रास्ता है।


13
यह है? जवाब बहुत सीधा है।
15:11 बजे अमित

क्या आपने देखा कि वह एक charमूल्य नहीं चाहता है ? और वह जानता है कि कैसे करना है substring()लेकिन सिर्फ एक "एनटर" रास्ता चाहता है। FYI करें, मैं कह सकता हूं कि substring()यह सबसे साफ तरीका है।
user845279

3
@ user845279 Character.toStringसभी आवश्यक आवश्यकताओं को पूरा करता है और बिल्कुल भी गड़बड़ नहीं है।
रिकार्डो अल्टामिरानो

@pythonscript मैं सहमत हूं, लेकिन यह substring()सीधे उपयोग करने से बहुत अलग नहीं है ।
user845279

1
मुझे इस पार्टी में देर हो रही है, लेकिन @RicardoAltamirano थोड़ा गलत है। का endIndex(दूसरा पैरामीटर) String.substring(int, int)एक विशेष सूचकांक है, और यह एक अपवाद को तब तक नहीं फेंकेगा index + 1जब तक index < length()- जो कि स्ट्रिंग के अंतिम वर्ण के लिए भी सत्य है।
विलियम मूल्य

जवाबों:


339

जिस विधि की आपको तलाश है charAt। यहाँ एक उदाहरण है:

String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f

अधिक जानकारी के लिए, Java दस्तावेज़ को देखेंString.charAt । यदि आप एक और सरल ट्यूटोरियल चाहते हैं, तो यह एक या यह एक है

यदि आप परिणाम को charडेटा प्रकार के रूप में नहीं, बल्कि स्ट्रिंग के रूप में चाहते हैं, तो आप Character.toStringविधि का उपयोग करेंगे :

String text = "foo";
String letter = Character.toString(text.charAt(0));
System.out.println(letter); // Prints f

यदि आप Characterकक्षा और toStringविधि के बारे में अधिक जानकारी चाहते हैं , तो मैंने Character.toString पर अपनी जानकारी दस्तावेज़ से खींच ली ।


1
"यहाँ महत्वपूर्ण बात यह है कि जब विधि लागू की जाती है तो मुझे एक चार्ट नहीं मिलता है, लेकिन एक स्ट्रिंग", लेकिन फिर भी धन्यवाद (upvote): D
Bluefire

1
मुझे लगता है कि सिल्वेन लेरॉक्स का जवाब बेहतर है। चरित्र के बारे में डॉक्टर
Chaojun Zhong

मैं @ChaojunZhong से सहमत हूं, यह एक अधिक उपयुक्त उत्तर है क्योंकि यह charAt () का उपयोग करने के लिए उचित नहीं है क्योंकि आपको समस्या होती है जब आपके पास वर्ण होते हैं जो 2 कोड इकाइयों की आवश्यकता होती है।
bpunzalan

43

तुम्हें चाहिए .charAt()

यहाँ एक ट्यूटोरियल है

"mystring".charAt(2)

रिटर्न s

यदि आप एक स्ट्रिंग होने पर नरकवान हैं तो एक तार को एक स्ट्रिंग में बदलने के कुछ तरीके हैं:

String mychar = Character.toString("mystring".charAt(2));

या

String mychar = ""+"mystring".charAt(2);

या और भी

String mychar = String.valueOf("mystring".charAt(2));

उदाहरण के लिए।


@ametren क्या स्ट्रिंग स्ट्रिंग संघनन बेहतर है Character.toString?
रिकार्डो अल्टामिरानो

मुझे लगता है कि व्यक्तिगत पसंद की बात हो सकती है। आप यह भी कर सकते हैंString mychar = String.valueOf("mystring".charAt(2));
ametren

ढेर करने के लिए, इस मामले में मेरी व्यक्तिगत पसंद होगी String mychar = ""+"mystring".charAt(2);क्योंकि यह सबसे संक्षिप्त है। अन्य लोग इस पर अपनी राय में भिन्न होंगे।
अमेत्रेन

10

प्रस्तावित उत्तरों में से कोई भी यूनिकोड बेसिक मल्टीलीग्युअल प्लेन के बाहर वर्णों को एनकोड करने के लिए इस्तेमाल किए गए सरोगेट जोड़े के लिए काम करता है ।

यहाँ एक स्ट्रिंग के "वर्ण" पर झुकाव के लिए तीन अलग-अलग तकनीकों का उपयोग करके एक उदाहरण है (incl। Java 8 स्ट्रीम एपीआई का उपयोग करके)। कृपया ध्यान दें कि इस उदाहरण में यूनिकोड अनुपूरक बहुभाषी विमान (एसएमपी) के अक्षर शामिल हैं। इस उदाहरण और परिणाम को सही ढंग से प्रदर्शित करने के लिए आपको एक उचित फ़ॉन्ट की आवश्यकता है।

// String containing characters of the Unicode 
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";

वर्णों का फेर

पहला समाधान charस्ट्रिंग के सभी पर एक सरल लूप है :

/* 1 */
System.out.println(
        "\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
    char c = str.charAt(pos);
    System.out.printf("%s ", Character.toString(c));
    //                       ^^^^^^^^^^^^^^^^^^^^^
    //                   Convert to String as per OP request
}

कोड बिंदुओं का फेरबदल

दूसरा समाधान एक स्पष्ट लूप का भी उपयोग करता है, लेकिन कोडपॉइंट के साथ अलग-अलग कोड पॉइंट एक्सेस करना और चार्ट के अनुसार लूप इंडेक्स को बढ़ाना :

/* 2 */
System.out.println(
        "\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
    int cp = str.codePointAt(pos);

    char    chars[] = Character.toChars(cp);
    //                ^^^^^^^^^^^^^^^^^^^^^
    //               Convert to a `char[]`
    //               as code points outside the Unicode BMP
    //               will map to more than one Java `char`
    System.out.printf("%s ", new String(chars));
    //                       ^^^^^^^^^^^^^^^^^
    //               Convert to String as per OP request

    pos += Character.charCount(cp);
    //     ^^^^^^^^^^^^^^^^^^^^^^^
    //    Increment pos by 1 of more depending
    //    the number of Java `char` required to
    //    encode that particular codepoint.
}

स्ट्रीम एपीआई का उपयोग करके कोड बिंदुओं पर Iterate करें

तीसरा समाधान मूल रूप से दूसरे के समान है, लेकिन जावा 8 स्ट्रीम एपीआई का उपयोग कर :

/* 3 */
System.out.println(
        "\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
    cp -> {
        char    chars[] = Character.toChars(cp);
        //                ^^^^^^^^^^^^^^^^^^^^^
        //               Convert to a `char[]`
        //               as code points outside the Unicode BMP
        //               will map to more than one Java `char`
        System.out.printf("%s ", new String(chars));
        //                       ^^^^^^^^^^^^^^^^^
        //               Convert to String as per OP request
    });

परिणाम

जब आप उस परीक्षण कार्यक्रम को चलाते हैं, तो आप प्राप्त करते हैं:

Using char iterator (do not work for surrogate pairs !)
T h e   q u i c k   b r o w n   ? ?   j u m p s   o v e r   t h e   l a z y   ? ? ? ? ? ? ? ? 

Using Java 1.5 codePointAt(works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

Using Java 8 stream (works as expected)
T h e   q u i c k   b r o w n   𓃥   j u m p s   o v e r   t h e   l a z y   𓊃 𓍿 𓅓 𓃡 

जैसा कि आप देख सकते हैं (यदि आप चित्रलिपि को ठीक से प्रदर्शित करने में सक्षम हैं), तो पहला समाधान यूनिकोड बीएमपी के बाहर ठीक से वर्णों को नहीं संभालता है। दूसरी ओर, अन्य दो समाधान सरोगेट जोड़े के साथ अच्छी तरह से व्यवहार करते हैं।


8

आप substring()अपनी आवश्यकताओं को देखते हुए , बहुत अच्छे से फंस गए हैं। मानक तरीका होगा charAt(), लेकिन आपने कहा था कि आप एक चार्ट डेटा प्रकार स्वीकार नहीं करेंगे।


काफी उचित। लेकिन, चूँकि एक आदिम प्रकार है, तो मुझे लगता है कि toString()इस पर काम नहीं किया जाएगा, और valueOf()यह केवल संख्याओं के लिए है (मुझे लगता है, मैं गलत हो सकता हूं), इसलिए मैं एक स्ट्रिंग को कैसे चार में परिवर्तित कर सकता हूं?
ब्लूफायर

चरित्र "ऊपर सवाल से, में" "मैं चार डेटा प्रकार मतलब यह नहीं है" - मैं के रूप में इस पढ़ नहीं है "मैं एक को स्वीकार नहीं करेगा char"
ametren

@Bluefire मेरा जवाब देखें। Character.toStringकाम करना चाहिए (यह Characterकक्षा से एक स्थिर तरीका है ।
रिकार्डो अल्टामिरानो


5

एक हाइब्रिड एप्रोच जो charAtआपकी आवश्यकता के अनुरूप है जिसमें चार नहीं हो सकते

newstring = String.valueOf("foo".charAt(0));

लेकिन यह वास्तव में substring()ईमानदार होने की तुलना में "नटर" नहीं है।



4

यहाँ सही कोड है। यदि आप zybooks का उपयोग कर रहे हैं तो यह सभी समस्याओं का जवाब देगा।

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}

0

अगर कोई कोटलिन के साथ संघर्ष कर रहा है, तो कोड है:

var oldStr: String = "kotlin"
var firstChar: String = oldStr.elementAt(0).toString()
Log.d("firstChar", firstChar.toString())

यह स्थिति 1 में char को लौटाएगा। इस स्थिति में k याद रखें, सूचकांक 0 में शुरू होता है, इसलिए इस नमूने में: kotlin k = स्थिति 0, o = स्थिति 1, t = स्थिति 2, l = स्थिति 3, i = स्थिति 4 और n = स्थिति 5


-3

ऐशे ही:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);

ओपी ने कहा कि String1 की लंबाई वांछित है, ए नहींchar
विलियम प्राइस

स्वीकार किए गए एक सहित 6 अन्य जवाब, charAt()संभव समाधान के रूप में सुझाए गए । यह उत्तर क्या जोड़ता है?
डैन गेट्ज़

6
इसके अलावा, ऐसा लगता है कि आप संकेत दे रहे हैं कि charAt()1-आधारित सूचकांकों का उपयोग करता aहै, तीसरी स्थिति में एकमात्र अलग चरित्र है । यदि यह सच था, तो आपके लिए यह कहना या समझाना बेहतर होगा कि इस पर संकेत देना चाहिए। वास्तव में यह सच नहीं है: charAt()0-आधारित सूचकांकों का उपयोग करता है, इसलिए sयह होगा 'h'
डैन गेट्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.