2010-11-21 14 views
17

पुनरावृत्ति के दौरान उसी हैश मैप इंस्टेंस की कुंजी बदलना संभव है? क्योंकि मानचित्र प्रविष्टि सेट में कोई विधि प्रविष्टि नहीं है .setKey()। अब मैं क्या सोच सकता हूं एक और हैश मैप बना रहा है ...पुनरावृत्ति के दौरान हैश मैप कुंजी बदलना

MultipartParsingResult parsingResult = parseRequest(request); 

Map<String, String[]> mpParams = parsingResult.getMultipartParameters(); 
Map<String, String[]> mpParams2 = new HashMap<String, String[]>(); 

Iterator<Entry<String,String[]>> it = mpParams.entrySet().iterator(); 

while (it.hasNext()) { 
    Entry<String,String[]> entry = it.next(); 
    String name = entry.getKey(); 

    if (name.startsWith(portletNamespace)) { 
     mpParams2.put(name.substring(portletNamespace.length(), name.length()), entry.getValue()); 
    } 
    else { 
     mpParams2.put(name, entry.getValue()); 
    } 
} 

उत्तर

9

आपको पुनरावृत्ति के बाद इसे संशोधित करने के लिए अन्य संग्रह में जानकारी रखना चाहिए। आप इटरेटर के दौरान iterator.remove() का उपयोग करके केवल प्रविष्टि को हटा सकते हैं। HashMap अनुबंध पुनरावृत्ति के दौरान इसे म्यूट करने से मना कर देता है।

+5

आप मानचित्र में कभी भी एक महत्वपूर्ण मूल्य नहीं बदल सकते हैं। – EJP

+0

प्रदर्शन बिंदु से, क्या समाधान यहां मेरे पास है? क्योंकि प्रति घंटे हजारों कॉल होने वाले – lisak

+0

@EJP जो मैं यहां बदल रहा हूं वह केवल नक्शा की कुंजी हैं – lisak

2

हैश मैप में कुंजी या मानों के लिए आप चार सामान्य प्रकार के संशोधन करना चाहते हैं।

  1. हैश मैप कुंजी बदलने के लिए, आप मूल्य वस्तु को देखते हुए देखते हैं, फिर पुरानी कुंजी को हटा दें और इसे नई कुंजी के साथ रखें।
  2. किसी ऑब्जेक्ट ऑब्जेक्ट में फ़ील्ड्स को बदलने के लिए, वैल्यू ऑब्जेक्ट को कुंजी के साथ देखें, फिर इसके सेटर विधियों का उपयोग करें।
  3. मूल्य वस्तु को पूरी तरह से बदलने के लिए, बस पुरानी कुंजी पर एक नया मान ऑब्जेक्ट डालें।
  4. मूल्य वस्तु को पुराने के आधार पर प्रतिस्थापित करने के लिए, वैल्यू ऑब्जेक्ट को प्राप्त करने के साथ देखें, एक नई ऑब्जेक्ट बनाएं, पुराने डेटा से डेटा कॉपी करें, फिर नई ऑब्जेक्ट को उसी कुंजी के नीचे रखें।

इस उदाहरण की तरह कुछ।

static class Food 
    { 
    // ------------------------------ FIELDS ------------------------------ 

    String colour; 

    String name; 

    float caloriesPerGram; 
    // -------------------------- PUBLIC INSTANCE METHODS -------------------------- 

    public float getCaloriesPerGram() 
     { 
     return caloriesPerGram; 
     } 

    public void setCaloriesPerGram(final float caloriesPerGram) 
     { 
     this.caloriesPerGram = caloriesPerGram; 
     } 

    public String getColour() 
     { 
     return colour; 
     } 

    public void setColour(final String colour) 
     { 
     this.colour = colour; 
     } 

    public String getName() 
     { 
     return name; 
     } 

    public void setName(final String name) 
     { 
     this.name = name; 
     } 

    public String toString() 
     { 
     return name + " : " + colour + " : " + caloriesPerGram; 
     } 

    // --------------------------- CONSTRUCTORS --------------------------- 

    Food(final String name, final String colour, final float caloriesPerGram) 
     { 
     this.name = name; 
     this.colour = colour; 
     this.caloriesPerGram = caloriesPerGram; 
     } 
    } 

// --------------------------- main() method --------------------------- 

/** 
* Sample code to TEST HashMap Modifying 
* 
* @param args not used 
*/ 
public static void main(String[] args) 
    { 
    // create a new HashMap 
    HashMap<String, Food> h = new HashMap<String, Food>(149 
      /* capacity */, 
      0.75f 
      /* loadfactor */); 

    // add some Food objecs to the HashMap 
    // see http://www.calorie-charts.net for calories/gram 
    h.put("sugar", new Food("sugar", "white", 4.5f)); 
    h.put("alchol", new Food("alcohol", "clear", 7.0f)); 
    h.put("cheddar", new Food("cheddar", "orange", 4.03f)); 
    h.put("peas", new Food("peas", "green", .81f)); 
    h.put("salmon", new Food("salmon", "pink", 2.16f)); 

    // (1) modify the alcohol key to fix the spelling error in the key. 
    Food alc = h.get("alchol"); 
    h.put("alcohol", alc); 
    h.remove("alchol"); 

    // (2) modify the value object for sugar key. 
    Food sug = h.get("sugar"); 
    sug.setColour("brown"); 
    // do not need to put. 

    // (3) replace the value object for the cheddar key 
    // don't need to get the old value first. 
    h.put("cheddar", new Food("cheddar", "white", 4.02f)); 

    // (4) replace the value object for the peas key with object based on previous 
    Food peas = h.get("peas"); 
    h.put("peas", new Food(peas.getName(), peas.getColour(), peas.getCaloriesPerGram() * 1.05f)); 

    // enumerate all the keys in the HashMap in random order 
    for (String key : h.keySet()) 
     { 
     out.println(key + " = " + h.get(key).toString()); 
     } 
    }// end main 
} 

मुझे आशा है कि इस मदद करता है

17

हो सकता है कि इस मदद करता है:

map.put(newkey,map.remove(oldkey)); 
+0

यदि मैं कीसेट पर पुनरावृत्ति कर रहा हूं, तो क्या यह नई जोड़ा कुंजी मौजूदा कीसेट में दिखने जा रही है? – Ring

0

तो सबसे अच्छा होगा संशोधनों आप चाहते हैं के साथ एक नया एक में नक्शा कॉपी करने के लिए, तो यह नया वापसी है पुराने और नक्शे को नष्ट कर दें। मुझे आश्चर्य है कि इस समाधान का प्रदर्शन प्रभाव क्या है।