कुशल तरीके से मानचित्र से कई कुंजियाँ निकालें?


124

मेरे पास Map<String,String>बड़ी संख्या में महत्वपूर्ण मूल्य जोड़े हैं। अब मैं उसमें से चयनित कुंजियाँ निकालना चाहता हूँ Map। निम्नलिखित कोड दिखाता है कि मैंने क्या हासिल किया।

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

फिर :

Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
   map.remove( entriesIterator.next().toString());
} 

यह काम कर रहा है। मैं सिर्फ यह जानना चाहता हूं कि मेरी आवश्यकता को प्राप्त करने का एक बेहतर तरीका क्या होगा?

जवाबों:


241

तार आप निकालना चाहते हैं अपने निर्धारित मान लिया जाये कि होता है, तो आप उपयोग कर सकते हैं विधि और ।keySetmap.keySet().removeAll(keySet);

keySetइस नक्शे में निहित कुंजियों का एक सेट दृश्य देता है। सेट को मानचित्र द्वारा समर्थित किया जाता है, इसलिए मानचित्र में परिवर्तन सेट में दिखाई देता है, और इसके विपरीत।

उदाहरण दिया गया:

Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");

Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");

map.keySet().removeAll(set);

System.out.println(map); //only contains "c"

आपका सुझाव बहुत अच्छा है। मुझे लगता है कि निष्कासन (कीसेट) वही कर रहा है जो मैंने वहां किया था
रुचिरा गायन राणावेरा

11
"कार्यकुशलता" के संदर्भ में, शायद यह सिर्फ लूप के लिए है, लेकिन क्लीनर कोड के संदर्भ में, अच्छी जीत :)
रॉगरडैक

3

केवल पूर्णता के लिए:

जैसा कि अनुमान लगाया गया है कि java.util.AbstractSet#removeAllसभी प्रविष्टियों पर वास्तव में ध्यान दिया जाता है, लेकिन एक छोटी सी चाल के साथ: यह छोटे संग्रह के पुनरावृत्त का उपयोग करता है:

if (size() <= collection.size()) {
    Iterator<?> it = iterator();
    while (it.hasNext()) {
        if (collection.contains(it.next())) {
            it.remove();
        }
    }
} else {
    Iterator<?> it = collection.iterator();
    while (it.hasNext()) {
        remove(it.next());
    }
}

1

जावा स्ट्रीम का उपयोग करना:

keySet.forEach(map::remove);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.