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