java - 将一堆常量字符串(键)与 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));
}
}
我正在寻找更快的解决方案,因为这只是大型应用程序的一小部分。我很擅长编写大量代码来实现这一目标。
解决方案
您可以将所有常量键存储在一个文件中,其中每一行包含一个键。然后您可以获得所有必需的密钥,例如:
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
更新:虽然使用所需键获取地图可能看起来更紧凑,但您示例中的 for-loop withcontainsKey
方法比contains
. 您可能应该使用评论中留下的@Holger 建议
推荐阅读
- visual-studio - Visual Studio:如何在连续执行中重用相同的控制台
- mongoose - 猫鼬将项目添加到数组
- javascript - 一个函数,它接受两个参数,一个数组和一个元素,它返回给定元素的索引
- javascript - 如何使用 JavaScript 创建用于打印的表格设计
- python - 如何在python上将.hex文件拆分为512字节
- reactjs - AWS Amplify React 构建失败模块解析失败:意外令牌 (1:0)
- jenkins-pipeline - 如何让 Jenkins 管道只为给定的分支构建
- python - 如何从两个数据框之间的合并中显示单个数据框的值?
- javascript - 后台脚本错误 - “错误:browser.tabs 未定义”
- python - 在 python 中使用函数更新 SQLite 列 DB