Самый оптимальный способ поиска по карте - PullRequest
0 голосов
/ 11 июня 2018

У меня есть карта (скажем, о людях, например):

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 голосов
/ 11 июня 2018

вы можете использовать API Java Stream.

personMap.entrySet().stream()
    .filter(entry -> entry.getValue().getName().toLowerCase().contains(query.toLowerCase())
    .map(entry -> entry.getValue())
    .collect(Collectors.toList());
0 голосов
/ 11 июня 2018

Подумав об этом мгновение, кажется, что Я человек, который собирается предложить потоковое решение.Я не «делаю все с потоками сейчас», но потоки предлагают довольно простой и понятный способ выражения некоторых видов вычислений, и ваш - один из них.Комбинируя это с моим наблюдением, что вы должны работать непосредственно со сбором значений карты, вы получаете это:

listOfPeople = personMap.values().stream()
        .filter(p -> p.getName().contains(query.toLowerCase()))
        .collect(Collectors.toList());
if (listOfPeople.isEmpty()) {
    // ...
0 голосов
/ 11 июня 2018

Я думаю, что ваше решение близко к оптимальному (за исключением использования потоков).Я бы упростил предложение for следующим образом:

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

Поскольку вы вообще не используете ключ карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...