搜索地图的最佳方式

时间:2018-06-11 00:52:51

标签: java list search optimization hashmap

我有一张地图(比如人们,每个例子),就像这样:

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

提前致谢

3 个答案:

答案 0 :(得分:5)

考虑到这一点,我认为我是即将提供基于流的解决方案的人。我不是一个“现在用流做任何事情”的人,但是流提供了一种相当简单易读的方式来表达某种类型的计算,而你的是其中之一。结合我的观察,你应该直接使用地图的价值集,你得到这个:

listOfPeople = personMap.values().stream()
        .filter(p -> p.getName().contains(query.toLowerCase()))
        .collect(Collectors.toList());
if (listOfPeople.isEmpty()) {
    // ...

答案 1 :(得分:4)

我认为您的解决方案接近最优(除了使用Streams)。我会将for子句简化为:

for (Person person : this.personMap.values()) {
    String name = person.getName();
    if (name.toLowerCase().contains(query.toLowerCase())) {
        listOfPeople.add(person);
    }
}

因为你根本没有使用地图的键。

答案 2 :(得分:2)

您可以使用java Stream API。

personMap.entrySet().stream()
    .filter(entry -> entry.getValue().getName().toLowerCase().contains(query.toLowerCase())
    .map(entry -> entry.getValue())
    .collect(Collectors.toList());