2013-04-14 9 views
5

मुझे यह जानकर आश्चर्य हो रहा है कि कौन सा प्रोग्राम संस्करण बेहतर रनटाइम है?
दोनों प्रकार लागू करने के लिए आसान लग रहा है। लेकिन उपयोग करने के लिए बेहतर क्या हैं और किस मामले में?कौन सा संस्करण स्ट्रिंग रिवर्स बेहतर है?

स्ट्रिंग रिवर्स:

public static String reverse(String s) 
{ 
    String rev = ""; 
    for (int i = s.length() - 1; i >= 0; i--) 
     rev += s.charAt(i); 
    return rev; 
} 

stringbuilder रिवर्स:

public static String reverse(String s) 
{ 
    StringBuilder rev = new StringBuilder(); 
    for (int i = s.length() - 1; i >= 0; i--) 
     rev.append(s.charAt(i)); 
    return rev.toString(); 
} 
+2

आपको यह करने की कितनी बार आवश्यकता है? यदि आप दूसरे पर एक विकल्प चुनते हैं तो व्यवसाय में कितना अंतर आएगा?जब तक आप इन सवालों का जवाब नहीं दे सकते, आपके पास निर्णय लेने के लिए बहुत अधिक आधार नहीं है। आप बस इतना कह सकते हैं कि दूसरा पहले की तुलना में अधिक कुशल है, * यदि * आपके पास 1 वर्ण से अधिक स्ट्रिंग है। –

+1

दूसरा स्निपेट बेहतर 'रैखिक समय' का उपयोग करता है। पहले 'वर्गबद्ध समय' का उपयोग करें। –

उत्तर

6

जोड़कर पर होती हैं: मैं एक दूसरे

पसंद करते हैं क्योंकि compiler will convert the first one from:

rev += s.charAt(i);

रहे हैं:

(new StringBuilder()).append(rev).append(s.charAt(i)).toString();

लेकिन, see the worst case scenario:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     long now = System.currentTimeMillis(); 
     slow(); 
     System.out.println("slow elapsed " + (System.currentTimeMillis() - now) + " ms"); 

     now = System.currentTimeMillis(); 
     fast(); 
     System.out.println("fast elapsed " + (System.currentTimeMillis() - now) + " ms"); 
    } 

    private static void fast() 
    { 
     StringBuilder s = new StringBuilder(); 
     for(int i=0;i<100000;i++) 
      s.append("*");  
    } 

    private static void slow() 
    { 
     String s = ""; 
     for(int i=0;i<100000;i++) 
      s+="*"; 
    } 
} 

उत्पादन होगा:

slow elapsed 173 ms 
fast elapsed 1 ms 
+1

+1 कंपाइलर रूपांतरण को इंगित करने और समय परीक्षण कोड प्रदान करने के लिए +1 (यदि मैं कर सकता तो +2 होगा! :) – acdcjunior

5

न तो वास्तव में बहुत अच्छा है पर विचार तुम सिर्फ कर सकते हैं:

new StringBuilder(str).reverse().toString(); 

आप तो को उपर्युक्त में से किसी एक का उपयोग करना था, फिर स्ट्रिंगबिल्डर रिवर्स चुनें - पहले के साथ आप छत के माध्यम से जीसी भेज सकते हैं और कई स्ट्रिंग ऑब्जेक्ट्स का निपटान कर सकते हैं क्योंकि आपके पास अक्षर हैं। जावा में

+3

StringBuilder.reverse() का उपयोग अलग है: यह सरोगेट जोड़े को एक वर्ण के रूप में मानता है, जबकि उपरोक्त दोनों स्निपेट नहीं करते हैं। तो अगर सरोगेट जोड़े को सिंगल चार के रूप में माना जाना चाहिए, तो StringBuilder.reverse() का उपयोग करना एक अच्छा विचार है। अन्यथा, यदि प्रदर्शन मुख्य चिंता है, तो यह शायद दूसरी स्निपेट की तुलना में धीमी है। –

+0

@JBNizet अच्छा बिंदु, मैं सरोगेट जोड़े के बारे में भूल गया था। – berry120

0

String वर्ग अपरिवर्तनीय है और उसके जीवन में नहीं बदल सकते हैं, और दो स्ट्रिंग के संयोजन नई String बना सकते हैं और वापस जाने के लिए, लेकिन StringBuilder वर्णों की एक अस्थायी अनुक्रम कि स्मृति में स्ट्रिंग के पात्रों को बदल सकते हैं, और StringBuilder उपयोग कर रहा है बेहतर होना चाहिए। StringBuilderString
, और देखो StringBuilder वर्ग स्रोत कोड चाहते हैं समझने के लिए वास्तव में है:
एक और समाधान के रूप में, आप सरणी चार स्ट्रिंग के लिए और सरणी रिवर्स और अंत में स्ट्रिंग

char[] arr = s.toCharArray(); 
char tmp; 
int maxIndex = arr.length-1; 
for(int i = arr.length>>2; i>=0;i--) { 
    tmp = arr[i]; 
    arr[i] = arr[maxIndex-i]; 
    arr[maxIndex-i] = tmp; 
} 
return new String(arr); 

में बदलने में अधिक जानकारी के लिए जावाडोक देखने में बदल सकते हैं अपने दो मामलों में एक चरित्र

0

कुछ दिलचस्प विवरण।
हम एक स्ट्रिंग को रिवर्स करने के लिए एक रिकर्सिव फ़ंक्शन लिख सकते हैं और किसी भी लूप का उपयोग नहीं कर सकते हैं। स्ट्रिंग विधि substring() का उपयोग करें:

public static String reverse(String s) { 
    int N = s.length(); 
    if (N <= 1) return s; 
    String a = s.substring(0, N/2); 
    String b = s.substring(N/2, N); 
    return reverse(b) + reverse(a); 
} 

इस विधि कितनी कुशल है?
इस विधि में रैखिकथात्मक चलने का समय है।

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