2012-10-01 36 views
5

मेरे पास मेरे एप्लिकेशन में एक (बड़ी) स्ट्रिंग फ़ाइल है जिसमें यादृच्छिक चरित्र [एजेड] और [0-9] की एक श्रृंखला है, लेकिन ";", "/" , "?", ":" तथा "@"। मैं चाहता हूं कि मेरा आवेदन मुझे निकटतम स्थिति बताए जहां 6 अंक लगातार प्रदर्शित होते हैं (जैसे "105487" या "558463")।जावा - 6 यादृच्छिक संख्याओं के लिए स्ट्रिंग को कैसे खोजें

इसे प्राप्त करने का सबसे अच्छा तरीका क्या होगा? इसे देखने के लिए धन्यवाद।

+0

कृपया "निकटतम स्थिति" पर स्पष्ट। क्या यह फाइल में पहला मौका है? –

+0

क्या स्थिति फ़ाइल में लाइन नंबर और कॉलम का मतलब है? –

+0

हाँ, मेरा मतलब पहला मौका था। स्थिति का मतलब सिर्फ उस नंबर पर है जो जावा में इंडेक्सऑफ फ़ंक्शन एक संख्या के रूप में देगा। – DVPeer

उत्तर

1

एक प्रभावी दृष्टिकोण स्ट्रिंग के पात्रों को फिर से शुरू करना होगा और प्रत्येक अंक एक परीक्षण होगा। एक मैच खोजने पर शेष अनुक्रम की तलाश जारी है। कुछ

int nDigits=0, i = 0; 
CharacterIterator it = new StringCharacterIterator("very long string123456"); 
for (char ch=it.first(); ch != CharacterIterator.DONE; ch=it.next()) { 
    i++; 
    nDigits = (ch.isDigit() ? nDigits++ : 0); 
    if (nDigits == 5) { 
     // DONE. Position is "i" 
    } 
} 
+0

धन्यवाद, मैं निश्चित रूप से यह कोशिश करूँगा। – DVPeer

3

स्ट्रिंग के वर्णों को पुन: सक्रिय करते समय Character.isDigit का उपयोग करें और फिर संख्या को गिनें जब तक कि आपको लगातार 6 संख्याएं न मिलें या अनुक्रम टूटने पर इसे रीसेट करें। इंडेक्स का ट्रैक रखें और आप घटाकर घटाकर निकटतम स्थिति की गणना कर सकते हैं।

यह बहुत ही कुशल नहीं है, लेकिन मुझे लगता है कि ओ (एन) स्ट्रिंग बहुत बड़ी नहीं होने पर पर्याप्त है। अनुकूलन के लिए लुइगी मेंडोज़ा पर टिप्पणियों में सुझाव दिया गया है कि एक नज़र डालें।

+0

आपके उत्तर के लिए धन्यवाद। मैंने सोचा कि यह एकमात्र समाधान होगा, लेकिन मैं उम्मीद कर रहा था कि जावा को ऐसा करने का एक और अधिक प्रभावी तरीका था। मैं इस पर गौर करूंगा। – DVPeer

+0

@ user1637234 आप एक नियमित अभिव्यक्ति का उपयोग कर सकते हैं जैसे कि लैब्लाबला ने पोस्ट किया है। –

+2

आप इसे अनुकूलित कर सकते हैं: यदि आपको स्थिति X में कोई अंक मिलता है, तो स्थिति X + 5 में वर्ण की जांच करें, यदि वह वर्ण कोई अंक नहीं है, तो यहां से खोजना प्रारंभ करें। यदि यह एक अंक है, तो वापस जाएं (एक्स + 4, एक्स + 3 ...) जब तक कि आप एक गैर-अंक प्राप्त न करें और कम से कम स्थिति से फिर से शुरू करें। –

4

आप रेगेक्स का उपयोग कर सकते हैं।

String regex = "(\\d{6})"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(YOU STRING HERE); 
// Check all occurrences 
while (matcher.find()) { 
    System.out.print("Start index: " + matcher.start()); 
    System.out.print(" End index: " + matcher.end()); 
    System.out.println(" Found: " + matcher.group()); 
} 

यह काम करेगा।

(here से कोड का नमूना)

+0

बहुत बड़ी स्ट्रिंग के लिए यह संभवतः ओओएमई – jdevelop

+2

के साथ विफल हो जाएगा क्यों इसके बजाय REGEX \\ d {6} का उपयोग नहीं करते? – gtgaxiola

+0

अच्छा, मुझे नहीं पता कि स्ट्रिंग कितनी देर है, लेकिन मुझे लगता है कि यह एक अच्छा विकल्प है। हालांकि इसे इंगित करने के लिए धन्यवाद। –