【发布时间】:2018-11-20 04:59:10
【问题描述】:
我有一张像这样的地图(比如说人):
public Map<String, Person> personMap = new HashMap<>();
我想通过这个按名称过滤的地图进行搜索。 我有这段代码,但我很好奇是否有更优化或更优雅的方法来做到这一点。
public ArrayList<Person> searchByName(String query) {
ArrayList<Person> listOfPeople = new ArrayList<>();
for (Map.Entry<String, Person> entry : this.personMap.entrySet()) {
Person person = entry.getValue();
String name = entry.getValue().getName();
if (name.toLowerCase().contains(query.toLowerCase())) {
listOfPeople.add(person);
}
}
if (listOfPeople.isEmpty()) {
throw new IllegalStateException("This data doesn't appear on the Map");
}
return listOfPeople;
}
提前致谢
【问题讨论】:
-
如果没有按名称键入,那么迭代是搜索每个条目的唯一方法。然而,为非异常状态抛出异常可能不是处理失败搜索的最佳方法。不找到您正在寻找的东西并不罕见 - 只需返回一个空列表并通过正常流程处理该案例。
-
地图中的第一个参数
String是什么?名字?因为您没有在for中使用它。 -
毫无疑问,有人会建议基于流的解决方案。你可以这样得到 terser,也许你会认为这样更优雅。我自己,我观察到由于您对此目的根本对密钥不感兴趣,因此通过条目集解决问题有点浪费。为什么不直接使用
values()集合呢? -
OP 返回
People列表的事实表明他们key不是必需的条目 -
Optional比异常好。
标签: java list search optimization hashmap