Пост приращения - PullRequest
       6

Пост приращения

0 голосов
/ 31 октября 2019

Я перебираю свою старую работу в Java, ищу ответы по всему интернету и не могу найти то, что мне нужно. У меня есть упорядоченный массив, который вводит значения в метод countOccurence (int [] list). Я понимаю, как работает массив, но мои вопросы;как массив может перемещаться на следующее число в счетчике, не создавая дубликатов дубликатов.

Как массив может пропускать дубликаты и перемещаться до конца, не просматривая все дубликаты по отдельности.

Вот код.

public static void Calculations(){
    Scanner in = new Scanner(System.in);
    int[] values = {1, 2, 2, 2, 2, 3};

    countOccurence(values);
}

public static void countOccurence(int[] list) {
    //12 23 45 56 56 0
    for (int i = 0; i < list.length; i++) {
        int count = 0;
        for (int j = 0; j < list.length ; j++) {
            if (list[j] == i)
                count += 1
        }
        if (count != 0)
            System.out.printf("%d happens %d %s%n",
                    i, count, count > 1 ? "times" : "time");
    }
}

}

1 Ответ

0 голосов
/ 31 октября 2019

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

public static void Calculations(){
    Scanner in = new Scanner(System.in);
    int[] values = {1, 2, 2, 3}; 
    //reducing few 2s to make the explanation shorter
    countOccurence(values);
}

    public static void countOccurence(int[] list) {
        //12 23 45 56 56 0
        for (int i = 0; i < list.length; i++) {
            int count = 0;
            for (int j = 0; j < list.length ; j++) {
                if (list[j] == i)
                    count += 1
            }
            if (count != 0)
                System.out.printf("%d happens %d %s%n",
                        i, count, count > 1 ? "times" : "time");
        }
    }
    }

Вот как это происходит: обратите внимание, я рассмотрел этот массив, чтобы он был коротким: int[] values = {1, 2, 2, 3};

Outer-loop iteration 1: i=0
     Inner-loop iteration 1: j=0, list[j]=list[0]=1!=(i=0), count=0
     Inner-loop iteration 2: j=1, list[j]=list[0]=2!=(i=0), count=0
     Inner-loop iteration 3: j=2, list[j]=list[0]=2!=(i=0), count=0
     Inner-loop iteration 4: j=3, list[j]=list[0]=3!=(i=0), count=0
     Print count 0

count=0 again
Outer-loop iteration 2: i=1
     Inner-loop iteration 1: j=0, list[j]=list[0]=1=(i=1), count=1
     Inner-loop iteration 2: j=1, list[j]=list[0]=2!=(i=1), count=1
     Inner-loop iteration 3: j=2, list[j]=list[0]=2!=(i=1), count=1
     Inner-loop iteration 4: j=3, list[j]=list[0]=3!=(i=1), count=1
     Print count 1

count=0 again
Outer-loop iteration 3: i=2
     Inner-loop iteration 1: j=0, list[j]=list[0]=1!=(i=2), count=0
     Inner-loop iteration 2: j=1, list[j]=list[0]=2=(i=2), count=1
     Inner-loop iteration 3: j=2, list[j]=list[0]=2=(i=2), count=2
     Inner-loop iteration 4: j=3, list[j]=list[0]=3!=(i=2), count=2
     Print count 2

count=0 again
Outer-loop iteration 4: i=3
     Inner-loop iteration 1: j=0, list[j]=list[0]=1!=(i=3), count=0
     Inner-loop iteration 2: j=1, list[j]=list[0]=2!=(i=3), count=0
     Inner-loop iteration 3: j=2, list[j]=list[0]=2!=(i=3), count=0
     Inner-loop iteration 4: j=3, list[j]=list[0]=3=(i=3, count=1
     Print count 1

i=4 теперь так i<list.length то есть 4<4 не соответствует действительности, и поэтому он выходит из внешнего цикла, и мы закончили. Итак, вот как это работает. Здесь нет пропуска элементов. Вы продолжаете увеличивать значение i, чтобы i никогда не повторялось. Таким образом, он никогда не печатает счет для дубликатов элементов. Он все еще перебирает массив, как и должен (во внутреннем цикле). Это просто i=2 никогда не будет верным снова или никогда не повторится, когда i has incremented to 3 и, таким образом, list[j]==i for i=2 не произойдет более одного раза.

Теперь, где проблема или недостаток в этомреализация? Эта реализация будет работать до тех пор, пока элементы или числа в вашем массиве меньше, чем длина самого массива.

Если исходный массив был чем-то вроде {1,2,2,4}, проверить наличие вхожденийиз 4, i придется увеличивать до 4, но длина массива также равна 4, и поэтому i<list.length, то есть 4<4 никогда не будет истинным, и поэтому число вхождений 4 или any number greater than 4 проверяться не будет. Таким образом, эта реализация прекрасно работает, пока элементы в массиве меньше, чем длина самого массива.

Чтобы исправить вашу реализацию, вам, возможно, придется сначала запустить отдельный цикл, чтобы получить наибольшее число в массивеа затем измените условие на i<=largestNumber.

...