Получение java.lang.NullPointerException при удалении ключа из хэш-карты в Java

https://leetcode.com/problems/top-k-frequent-elements/

проблема возникает в строке:

хм.remove(currentGreatestValue);

class Solution {
    public int[] topKFrequent(int[] nums, int k) {

        HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
        for (int i=0; i<nums.length; i++){
            if (!hm.containsKey(nums[i])){
                hm.put(nums[i], 1);
            } else {
                int occurances = hm.get(nums[i]);
                occurances = occurances + 1;
                hm.put(nums[i], occurances);
            }
        }
   
        int mostOccuredValues[] = new int[k]; 

        Iterator hmIterator = hm.entrySet().iterator();

        int currentGreatestValue=0;
        int currentValue;

        int nextGreatestIndex=0;


        for (int i=0; i<k; i++){
            while (hmIterator.hasNext()) {
                Map.Entry mapElement = (Map.Entry)hmIterator.next();
                currentValue = (int)mapElement.getKey();
                if (currentValue>currentGreatestValue){
                    currentGreatestValue = currentValue;
                }
            }
            mostOccuredValues[nextGreatestIndex] = hm.get(currentGreatestValue);
            nextGreatestIndex = nextGreatestIndex + 1;
 
            hm.remove(currentGreatestValue);
        }

        return mostOccuredValues;
    }
}

хотите удалить ключ из хэш-карты, чтобы получить следующий наибольший элемент во время итерации

Кстати, и я надеюсь, что это не разочарует. В вашей ссылке также написано «Последующие действия»: временная сложность вашего алгоритма должна быть лучше, чем O(n log n), где n — размер массива. Вы еще не там.

Anonymous 11.05.2024 07:28

Вам будет полезно научиться использовать отладчик.

Anonymous 12.05.2024 06:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Переместите эти две строки внутрь цикла. Вам необходимо сбросить эти два значения после каждой итерации цикла.

for (int i=0; i<k; i++){
    currentGreatestValue = 0;
    Iterator hmIterator = hm.entrySet().iterator();

Спасибо за ответ, который был частью проблемы, также я перепутал ключ/значения, когда удалял в цикле, я опубликовал ответ ниже.

user883311 11.05.2024 06:04

Пара проблем. Я сравнивал ключи вместо значений: в исходном коде ключ сохраняется как текущее значение. Затем мне пришлось сохранить ключи, когда я нашел наибольшее значение, чтобы потом удалить его.

user883311 11.05.2024 06:07

Я разместил правильный ответ ниже, вы можете увидеть разницу.

user883311 11.05.2024 06:08

Большой. Я ответил только на то, почему вы получаете нулевой указатель.

rahulP 11.05.2024 06:08
Ответ принят как подходящий

класс Решение { public int[] topKFrequent(int[] nums, int k) {

    HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    for (int i=0; i<nums.length; i++){
        if (!hm.containsKey(nums[i])){
            hm.put(nums[i], 1);
        } else {
            int occurances = hm.get(nums[i]);
            occurances = occurances + 1;
            hm.put(nums[i], occurances);
        }
    }

    int mostOccuredValues[] = new int[k]; 

    int currentValue;
    int currentKey;

    int nextGreatestIndex=0;


    for (int i=0; i<k; i++){
        int currentGreatestValue=0;
        int currentGreatestKey=0;
        
        Iterator hmIterator = hm.entrySet().iterator();
        while (hmIterator.hasNext()) {
            Map.Entry mapElement = (Map.Entry)hmIterator.next();
            currentValue = (int)mapElement.getValue();
            currentKey = (int)mapElement.getKey();
            
            if (currentValue>currentGreatestValue){
                currentGreatestValue = currentValue;
                currentGreatestKey = currentKey;
            }
        }

        mostOccuredValues[nextGreatestIndex] = currentGreatestKey;
        nextGreatestIndex = nextGreatestIndex + 1;

        hm.remove(currentGreatestKey);
    }

    return mostOccuredValues;
}

}

Спасибо за код. Я ее не читал и не знаю, может ли она ответить на ваш вопрос и как. Пожалуйста, предоставьте некоторые пояснения вместе с кодом.

Anonymous 11.05.2024 18:35

Почему за это проголосовали отрицательно, это правильный ответ, и часть ответа связана с исправленным нулевым указателем, это полная проблема с литкодом.

user883311 14.05.2024 17:39

Я проголосовал против, потому что код без объяснений бесполезен для других пользователей, каким бы правильным он ни был. Stack Overflow не является сервисом обмена кодом. Это место, куда люди приходят и получают ответы на вопросы. Я знаю, что вы опубликовали это из доброй воли, чтобы помочь другим в вашей ситуации, и спасибо за желание сделать это. Однако я боюсь, что ваш ответ в его нынешнем виде не поможет.

Anonymous 14.05.2024 18:55

Другие вопросы по теме