2012-06-12 10 views
10

विधि में संशोधित करें मान लें कि मुझे Map<String, String> मिला है और मैं foo वाले सभी प्रविष्टियों को हटाना चाहता हूं। अनुकूलन/स्मृति/आदि के संदर्भ में ऐसा करने का सबसे अच्छा तरीका क्या है? नीचे दिए गए चार syso एक ही परिणाम प्रिंट कर रहे हैं, जो {n2=bar} कहने के लिए है।किसी ऑब्जेक्ट को पैरामीटर के रूप में पास करें और इसे

public static void main(String[] args) { 

    Map<String, String> in = new HashMap<String, String>(); 
    in.put("n1", "foo"); 
    in.put("n2", "bar"); 
    in.put("n3", "foobar"); 

    // 1- create a new object with the returned Map 
    Map<String, String> in1 = new HashMap<String, String>(in); 
    Map<String, String> out1 = methodThatReturns(in1); 
    System.out.println(out1); 

    // 2- overwrite the initial Map with the returned one 
    Map<String, String> in2 = new HashMap<String, String>(in); 
    in2 = methodThatReturns(in2); 
    System.out.println(in2); 

    // 3- use the clear/putAll methods 
    Map<String, String> in3 = new HashMap<String, String>(in); 
    methodThatClearsAndReadds(in3); 
    System.out.println(in3); 

    // 4- use an iterator to remove elements 
    Map<String, String> in4 = new HashMap<String, String>(in); 
    methodThatRemoves(in4); 
    System.out.println(in4); 

} 

public static Map<String, String> methodThatReturns(Map<String, String> in) { 
    Map<String, String> out = new HashMap<String, String>(); 
    for(Entry<String, String> entry : in.entrySet()) { 
     if(!entry.getValue().contains("foo")) { 
      out.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    return out; 
} 

public static void methodThatClearsAndReadds(Map<String, String> in) { 
    Map<String, String> out = new HashMap<String, String>(); 
    for(Entry<String, String> entry : in.entrySet()) { 
     if(!entry.getValue().contains("foo")) { 
      out.put(entry.getKey(), entry.getValue()); 
     } 
    } 
    in.clear(); 
    in.putAll(out); 
} 

public static void methodThatRemoves(Map<String, String> in) { 
    for(Iterator<Entry<String, String>> it = in.entrySet().iterator(); it.hasNext();) { 
     if(it.next().getValue().contains("foo")) { 
      it.remove(); 
     } 
    } 
} 

उत्तर

4

सबसे अच्छा तरीका है methodThatRemoves वजह से है:

  1. स्मृति खपत के मामले में: यह एक नया नक्शा तो स्मृति भूमि के ऊपर नहीं जोड़ता है नहीं बना है।
  2. सीपीयू उपयोग के संदर्भ में: इटरेटर के पास ओ (1) जटिलता है जो वर्तमान कॉल को कॉल करने या वर्तमान तत्व को हटाने के लिए है। क्योंकि आप एक मध्यवर्ती मानचित्र का निर्माण नहीं करतीं और put विधि का उपयोग नहीं करते हैं, methodThatRemoves -
0

मैं व्यक्तिगत रूप से क्योंकि आप केवल एक पाश आपरेशन प्रदर्शन कर रहे हैं और "foo" समानता के लिए जाँच methodThatRemoves साथ जाना होगा। अन्य लोग ऑब्जेक्ट मैप सृजन और नक्शा स्पष्ट/रखे ऑपरेशन करते हैं। तो आप स्पष्ट रूप से 1 विधि कम कर रहे हैं।

यदि आप मेमोरी उपयोग को कम करना चाहते हैं तो आप 1 या अधिक प्रविष्टियों को हटाने के लिए अतिरिक्त हैश मैप नहीं बना सकते हैं। यह माना जाता है कि आप मानचित्र को फिर से शुरू करने के लिए अतिरिक्त गणना को ध्यान में रखते हैं।

यदि आप वास्तव में गहराई से अधिक जाना चाहते हैं, तो आपको प्रोफाइलर या किसी प्रकार का उपयोग करके इसका मूल्यांकन करना चाहिए।

1

मेरे लिए सबसे अच्छा Iterator साथ एक है।

वैसे पहले: methodThatReturns तेजी से हो सकता है क्योंकि put जटिलता ओ (1) है जबकि हटाएं ओ (एन) सबसे खराब स्थिति में है लेकिन यह अधिक स्मृति का उपयोग करेगा क्योंकि आपके पास मानचित्र के 2 अलग-अलग उदाहरण हैं।

2

लिए सबसे कारगर तरीका methodThatRemoves, क्योंकि यह

  • लगभग कोई स्मृति
  • को छोड़कर (हल्के) इटरेटर कोई वस्तुओं
  • बहुत तेज है बनाता है का उपयोग करता है (किसी भी नक्शे लुकअप का उपयोग नहीं करता)

मैं पहले एक प्रतिलिपि नहीं बनाऊंगा, जब तक कि आपके पास एक अप्रचलित मानचित्र न हो या आपको मूल को संरक्षित करने की आवश्यकता हो।

+0

यह बिल्कुल सही नहीं है कि क्या तरीका है? – tibtof

+0

हाँ यह बराबर से अलग कैसे है, जो वह वैसे भी नहीं चाहता है – jonasr

+0

ओह! मैंने सवाल स्किम किया:/मैं कोड हटा दूंगा :) – Bohemian

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

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