首页 > 解决方案 > 将一堆常量字符串(键)与 Map 进行比较的最佳方法

问题描述

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

现在我已经创建了一个所需键的列表,我正在迭代我收到的映射并将所需的对拉出到另一个映射中并传递它。这可行,但代码看起来很糟糕。

肯定有更好的方法来做到这一点。有什么建议么?

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

我需要帮助: 1. 存储所需密钥的方法比将它们放在列表中更好。这个键列表将是一个常数。将 60-120 个字符串硬编码到 List 中看起来很可怕。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));
    }
}

我正在寻找更快的解决方案,因为这只是大型应用程序的一小部分。我很擅长编写大量代码来实现这一目标。

标签: javacollections

解决方案


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

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

更新:虽然使用所需键获取地图可能看起来更紧凑,但您示例中的 for-loop withcontainsKey方法比contains. 您可能应该使用评论中留下的@Holger 建议


推荐阅读