比较一堆常量字符串(键)和Map的最佳方法

问题描述 投票:2回答:1

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

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

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

我想到使用包而不是匹配键,但我的要求是完全匹配。是的,我读到了使用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));
    }
}

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

java collections
1个回答
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循环比contains更快。您应该在评论中使用@Holger中的建议

© www.soinside.com 2019 - 2024. All rights reserved.