Неправильный цикл и выход за границы для HashMap при попытке дважды посчитать одно и то же значение - PullRequest
0 голосов
/ 04 ноября 2018

Этот код ниже принимает пользовательский ввод (значения int) и затем находит дубликат, четное число, число.

2 задачи :

  1. 1-е четное число печатается 3 раза, если у вас есть ввод 2 7 19 8 будет выглядеть 2, 2, 2, 8. Почему я не могу
    понимать.
  2. Часть хеш-карты, в которую я положил list.get(intNum)+1 для подсчета значения дважды выдает за границу. Без этого он работает. Как я могу посчитать номер дважды?

Заранее спасибо.

public class Various {

    static Scanner userinput= new Scanner(System.in);
    static int nums;
    static int big;//will be used to find bug number in array
    public static void main(String[] args) {

        List<Integer> list= new ArrayList<>();//for all numbers
        List<Integer> listEven= new ArrayList<>(); //just for evens
        Map<Integer,Integer> hmap= new HashMap<Integer,Integer>(); //number count

        System.out.println("Enter some numbers: ");
        nums=userinput.nextInt();
        big=nums;
        int evenNumber;

        list.add(nums);

        while(userinput.hasNextInt()){
            nums=userinput.nextInt();

            //below part of the code finds biggest value
            if(nums>big){
                big=nums;
            }
            //Above part of the code finds biggest value

            list.add(nums);

            //below part of the code finds/prints duplicate value
            for(int i=0;i<list.size()-1;i++){           
                for(int j=i+1;j<list.size();j++){
                    if(list.get(i)==list.get(j)){
                        System.out.println("Duplicate " + list.get(j));
                    }
                }
                //Above part of the code finds/prints duplicate value
            }
            //below part of the code finds even numbers
            for(int i=0;i<list.size();i++){
                //for loop will start from 0 till user input            
                if(list.get(i)%2==0){
                    //if any of those i values%2=0 those will be Even and I will capture those
                    listEven.add(list.get(i));
                }
                //Above part of the code finds even numbers
            }
            //below part of the code finds number occurrence count          
            for(Integer intNum: list){
                if(!(hmap).containsKey(intNum)){
                    hmap.put(intNum, 1);
                }else{
                    //below part to take care if a number comes twice i add 1 more(+1)
                    hmap.put(intNum, list.get(intNum)+1);
                }   
                //Above part of the code finds number occurrence count  
            }
        }
        System.out.println("Values are " + list);
        System.out.println("Biggest value " + big);
        System.out.println("Even numbers " + listEven);
        System.out.println("Numbers in list and occurance " + hmap);
    }
}

1 Ответ

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

выпуск A:

В вашем коде есть цикл while, который проверяет числа, но каждый раз, когда пользователь вводит число, вы просматриваете список чисел и проверяете четные числа.

Наиболее логичным способом было бы изменить ваш код, чтобы он проверял четные числа после того, как пользователь ввел все свои числа. Или вы можете добавить это, что является меньшим решением, но оно будет работать:


listEven.add(list.get(i));

Измените код выше на код ниже.

if (!listEven.contains(list.get(i))) {
    listEven.add(list.get(i));
}

Выпуск B:

Ошибка заключается в этом коде:

// below part of the code finds number occurrence count
for (Integer intNum : list) {
    if (!(hmap).containsKey(intNum)) {
        hmap.put(intNum, 1);
    } else {
        // below part to take care if a number comes twice i add 1
        // more(+1)
        hmap.put(intNum, list.get(intNum) + 1);
    }
    // Above part of the code finds number occurrence count
}

Вы пытаетесь выполнить list.get(intNum), однако метод get требует index , а не значения, которое вы пытаетесь найти. Я думаю, что вы хотели набрать hmap.get(intNum) вместо list.get(intNum), это обновит счет правильно.

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