मेरे पास एक Map<Long, String> और एक Set<Long> है।

कहो,

Map<Long, String> mapA
Set<Long> setB

मैं उन प्रविष्टियों को mapA से हटाना चाहता हूं, जिनकी कुंजियां setB में नहीं हैं।

साथ ही मैं उन सभी प्रविष्टियों के लिए लॉग प्रिंट करना चाहता हूं जिन्हें mapA से हटा दिया गया है।

वर्तमान में मैं इटरेटर का उपयोग कर रहा हूं।

for (Iterator<Map.Entry<Long, String>> iterator = mapA.entrySet().iterator();
     iterator.hasNext(); ) {

    Map.Entry<Long, String> entry = iterator.next();
    if (!setB.contains(entry.getKey())) {
        
        LOGGER.error(entry.getKey() + " does not exist");

        // Removing from map.
        iterator.remove();
    }
}

Java8 का उपयोग करके मैं इसे और अधिक संक्षिप्त रूप से कैसे कर सकता हूं?

0
reiley 17 अगस्त 2020, 22:43

2 जवाब

सबसे बढ़िया उत्तर

आप इस तरह की धाराओं का उपयोग कर सकते हैं;

mapA.entrySet().removeIf(e -> {
    if(setB.contains(e.getKey())){
        return true;
    }
    LOGGER.error(e.getKey() + " does not exist");
    return false;
});

या बेहतर तरीके से आप कीसेट को कॉल कर सकते हैं, यदि आपको मूल्यों की आवश्यकता नहीं है:

mapA.keySet().removeIf(k -> {
    if (setB.contains(k)) {
        return true;
    }
    LOGGER.error(k + " does not exist");
    return false;
});
2
YCF_L 17 अगस्त 2020, 22:49

आप नीचे दिखाए अनुसार mapA.keySet().removeAll(set-of-keys-which-are-not-in-setB) का उपयोग कर सकते हैं:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Map<Long, String> mapA = new HashMap<>(Map.of(1L, "One", 2L, "Two", 3L, "Three", 4L, "Four"));
        Set<Long> setB = new HashSet<>(Set.of(1L, 3L));

        // Set of keys which are not in setB
        Set<Long> temp = new HashSet<>(mapA.keySet());
        temp.removeAll(setB);

        mapA.keySet().removeAll(temp);

        System.out.println(mapA);
    }
}

आउटपुट:

{1=One, 3=Three}
0
Live and Let Live 17 अगस्त 2020, 23:00