Эффективный способ поиска String Array в Hashmap - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть следующий hashmap со строковым массивом:

public static HashMap<String, String[]> map = new HashMap<String, String[]>();
map.put("calculus",new String[] {"math","logic"});
map.put("chemisty",new String[] {"ions","electrons"});
map.put("biology",new String[] {"life","bacteria"});

У меня есть строка, которую я хочу найти в массивах String в Hashmap. Мой код:

public String findFn(String myString) {

    for (Map.Entry<String, String[]> entry : map.entrySet()) {

        String key = entry.getKey();

        for(String s : entry.getValue()) {
            if(s.contains(myString)) {
                return key;
            }
        }
    }
    return null;    
}

Это будет эффективно перебирать все значения hashmap, пока не будет найдено совпадение. Есть ли лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

С вашей текущей структурой данных это лучшее, что вы можете сделать. Если вам нужно делать это часто, вы должны создать другую Hashmap с обратной связью, где «тема» - это ключ, а «курс» - это значение.

0 голосов
/ 25 апреля 2019

Если количество записей в HashMap будет низким, а количество элементов в значениях будет большим, я бы просто изменил ваш код, заменив массивы HashSets:

public static HashMap<String, Set<String>> map = new HashMap<>();
map.put("calculus", new HashSet());
map.get("calculus").add("math");
...

public String findFn(String myString) {
    for (Map.Entry<String, Set<String>> entry : map.entrySet()) {           
        for(String s : entry.getValue()) {
            if(s.contains(myString)) {
                return entry.getKey();
            }
        }
    }
    return null;
}

HashSet.contains() имеет постоянную производительность, поэтому код будет повторяться только по количеству классификаторов.

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