将一堆常量字符串(键)与地图进行比较的最佳方法

时间:2019-02-18 11:09:40

标签: java collections

因此,我有一个映射(字符串,字符串),收到此映射可以包含大约600-800个条目。我的任务是根据键(常量字符串)仅检索这些对中的约60-120(基于某些逻辑)。

现在,我已经创建了所需密钥的列表,正在迭代收到的Map,并将所需的对提取到另一个Map中并传递给它。这行得通,但是代码看起来糟透了。

肯定有一种更好的方法可以做到这一点。有什么建议吗?

我想到了使用contains而不是匹配键,但是我的要求是完全匹配。是的,我读过有关使用RegEx进行精确匹配的信息,因此可以将其用作最后的手段。

我需要什么帮助: 1.比在列表中存储所需密钥更好的方法。该键列表将是一个常数。将60-120个字符串的列表硬编码到列表中看起来很可怕。 2.最快(时间)比较所述列表并提取所需对的方法。

我的代码:

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));
    }
}

我正在寻找更快的解决方案,因为这只是大型应用程序的很小一部分。我必须写很多代码才能做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以将所有常数键存储在文件中,其中每一行包含一个键。然后,您将获得所有必需的键,例如:

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

现在使用流filter方法获取具有必需键的地图:

 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

有关Collectors.toMapjavadoc

的更多信息

更新:虽然使用必需的键获取地图可能看起来更紧凑,但示例中的containsKey方法的for循环比{{1 }}。您可能应该使用评论中剩下的建议@Holger