HashMap / Hashtable не возвращает int в качестве значения ключа в цикле for - PullRequest
0 голосов
/ 11 ноября 2018

Когда я пытаюсь получить доступ к map.get (c) в цикле for (как показано в версии 2), он возвращает нулевое значение и устанавливает верхнюю границу равной нулю, что приводит к исключению нулевого указателя. С другой стороны, если я создаю конечную переменную и присваиваю ей значение map.get (c) (как показано в версии 1), она работает нормально. Итак, не могли бы вы объяснить, почему?

версия 1: отлично работает

    int count=0;
    int st=0;
    string s = "abcabcbb";

    Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

    char[] str = s.toCharArray();
    for(int i=0; i<str.length; i++){
        char c = str[i];
        if(map.get(c)==null){
            map.put(c, i);

            if(count < map.get(c) - st + 1){
                count = map.get(c) - st + 1;
            };
        }


        else {
            int end = map.get(c);     // End variable --> returns int value as expected

            for(int j=st; j<=end; j++){
                map.remove(str[j]);
                st = j+1;
            }
            map.put(c,i);
        }

    }

    System.out.println(count);

Версия 2: выдает исключение нулевого указателя

    int count=0;
    int st=0;
    string s = "abcabcbb";

    Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

    char[] str = s.toCharArray();
    for(int i=0; i<str.length; i++){
        char c = str[i];
        if(map.get(c)==null){
            map.put(c, i);

            if(count < map.get(c) - st + 1){
                count = map.get(c) - st + 1;
            };
        }


        else {
            //int end = map.get(c);     // End variable commented

            for(int j=st; j<=map.get(c); j++){   // replaced end w map.get(c) --> returns null instead of int
                map.remove(str[j]);
                st = j+1;
            }
            map.put(c,i);
        }

    }

    System.out.println(count);

Заранее спасибо за помощь! Рохан.

1 Ответ

0 голосов
/ 11 ноября 2018

Цикл for работает до тех пор, пока его условие не будет выполнено (в вашем случае, пока j <= map.get(c) не станет false). Это условие также не кэшируется , как показано в результате вывода кода ниже:

public static void main(String[] args) {
    for (int i = 0; i < getCondition(); i++) {

    }
}

private static int getCondition() {
    System.out.println("Test");
    return 3;
}

Выход:

Test
Test
Test
Test

По этой причине map.get(c) будет вызываться для каждой итерации цикла for. Если вам случится удалить запись с ключом c из map, то значение, возвращаемое из Map#get, равно null, что и вызывает NullPointerException.

...