WhiteBird
WhiteBird

Reputation: 117

Best way to compare bunch of Constant Strings (keys) with a Map

So, I have a Map (String, String) which I receive this map can have about 600-800 entries. My task is to retrieve only about 60-120 (based on some logic) of those pairs based on the keys (constant strings).

Right now I have created a List of the required Keys, I am iterating the Map I receive and pulling out required pairs into another Map and passing it on. This works, but the code looks horrible.

There surely has to be a better way of doing this. Any suggestions?

I thought of using contains instead of matching keys, but my requirement is for exact matches. Yes, I read about using RegEx for exact matches, so that can be used as a last resort.

What I need help with: 1. Better way to store required keys than having them in a List. This list of keys are going to be a constant. Having a list of 60-120 strings hardcoded into a List looks horrible. 2. Fastest (time) way to compare the said list and pull out required pairs.

My code:

List <String> keysToCheck = new ArrayList<String>();
keysToCheck.add("attrib1");
...
keysToCheck.add("attribN");

Map<String, String> newMap = new HashMap<String,  String>();
for (String key : keysToCheck) {
    if(mapRcvd.containsKey(key)) {
    newMap.put(key, mapRcvd.get(key));
    }
}

I am looking for solutions which would be quicker, as this would be a very small part of a larger application. I am good with having to write a lot of code to achieve that.

Upvotes: 2

Views: 99

Answers (1)

Ruslan
Ruslan

Reputation: 6290

You can store all constant keys in a file, where each line contains one key. Then you can get all required keys like:

List<String> requiredKeys = Files.lines(Paths.get(PATH_TO_FILE_WITH_KEYS))
            .collect(Collectors.toList());

Now get map with required keys using stream filter method:

 Map<String, String> collect = mapRcvd.entrySet().stream()  // get stream of map entries
            .filter(entry -> requiredKeys.contains(entry.getKey()))  // filter only such entries which has required key
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));  // collect all filtered entries into new map

More about Collectors.toMap, javadoc

Update: while getting map with required keys may seem more compact, the for-loop with containsKey method in your example is faster than contains. You should probably use the advice @Holger left in the comments

Upvotes: 1

Related Questions