2015-03-25 9 views
5

इस प्रश्न के लिए, मान लीजिए कि मेरे पास String है जिसमें Two;.Three;.Four(and so on) मान हैं लेकिन तत्व ;. से अलग हैं।जावा में स्ट्रिंग स्ट्रिंग का सबसे प्रभावी तरीका

अब मुझे पता है कि वहाँ एक स्ट्रिंग जैसे split() और StringTokenizer (किया जा रहा है तेजी से एक और अच्छी तरह से काम करता है) बंटवारे के गुणकों तरीके हैं, लेकिन मेरी इनपुट फ़ाइल 1GB आसपास है और मैं कुछ StringTokenizer की तुलना में थोड़ा और अधिक कुशल के लिए देख रहा हूँ।

कुछ शोध के बाद, indexOf और substring काफी कुशल हैं लेकिन उदाहरणों में केवल एक ही डिलीमीटर या परिणाम केवल एक शब्द/तत्व लौट रहे हैं।

नमूना indexOf और substring का उपयोग कर कोड:

String s = "quick,brown,fox,jumps,over,the,lazy,dog"; 
int from = s.indexOf(','); 
int to = s.indexOf(',', from+1); 
String brown = s.substring(from+1, to); 

मुद्रण brown के लिए ऊपर काम करता है लेकिन मैं कैसे indexOf और substring उपयोग कर सकते हैं कई सीमांकक के साथ एक पंक्ति विभाजित है और नीचे के रूप में सभी आइटम प्रदर्शित करने के लिए।

अपेक्षित उत्पादन

Two 
Three 
Four 
....and so on 
+1

आप क्या हासिल करने की कोशिश कर रहे हैं? क्या आपने विभिन्न परीक्षण मामलों पर परीक्षण किए हैं और देखें कि "कुशल" कौन सा है? –

+0

वहां 'इंडेक्सऑफ' ओवरलोड भी है जो 'स्ट्रिंग' लेता है ... – yshavit

+0

आपका मतलब यह है कि string.replaceAll ("; \\।", "\ N"); '? –

उत्तर

2

StringTokenizerStringBuilder से तेज़ है।

public static void main(String[] args) { 

    String str = "This is String , split by StringTokenizer, created by me"; 
    StringTokenizer st = new StringTokenizer(str); 

    System.out.println("---- Split by space ------"); 
    while (st.hasMoreElements()) { 
     System.out.println(st.nextElement()); 
    } 

    System.out.println("---- Split by comma ',' ------"); 
    StringTokenizer st2 = new StringTokenizer(str, ","); 

    while (st2.hasMoreElements()) { 
     System.out.println(st2.nextElement()); 
    } 
} 
3

आप दक्षता में परम चाहते हैं मैं Strings बिल्कुल का उपयोग नहीं होता है, अकेले उन्हें अलग हो गए। मैं करता हूं कि कौन से कंपाइलर्स करते हैं: फाइल को एक समय में एक चरित्र को संसाधित करें। एक बड़े बफर आकार के साथ BufferedReader का उपयोग करें, 128kb कहें, और एक समय में char पढ़ें, उन्हें StringBuilder कहने के लिए जमा करें जब तक आपको ; या लाइन टर्मिनेटर न मिल जाए।

+0

ठीक है यह एक कोशिश करेगा और रिपोर्ट करेगा। धन्यवाद – user92038111111

+0

@AvinashRaj आपकी टिप्पणी के मेरे जवाब के साथ कुछ लेना देना नहीं है। यहां अप्रासंगिक टिप्पणियां पोस्ट न करें। – EJP

+0

@AvinashRaj आपके पिछले टिप्पणी की तुलना में मेरे उत्तर के साथ कुछ और करने के लिए और कुछ नहीं है। – EJP

0

यह वह तरीका है जिसका उपयोग मैं बड़े (1 जीबी +) टैब से अलग फ़ाइलों को विभाजित करने के लिए करता हूं। यह अतिरिक्त विधि आमंत्रण (जिसे रनटाइम द्वारा अनुकूलित किया जा सकता है) के किसी भी ओवरहेड से बचने के लिए char डिलीमीटर तक सीमित है, लेकिन इसे आसानी से स्ट्रिंग-सीमांकित में परिवर्तित किया जा सकता है। अगर कोई इस विधि पर तेज विधि या सुधार के साथ आ सकता है तो मुझे दिलचस्पी होगी।

public static String[] split(final String line, final char delimiter) 
{ 
    CharSequence[] temp = new CharSequence[(line.length()/2) + 1]; 
    int wordCount = 0; 
    int i = 0; 
    int j = line.indexOf(delimiter, 0); // first substring 

    while (j >= 0) 
    { 
     temp[wordCount++] = line.substring(i, j); 
     i = j + 1; 
     j = line.indexOf(delimiter, i); // rest of substrings 
    } 

    temp[wordCount++] = line.substring(i); // last substring 

    String[] result = new String[wordCount]; 
    System.arraycopy(temp, 0, result, 0, wordCount); 

    return result; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे