Почему нет цикла «Для каждого» в неинициализированном массиве в Java - PullRequest
0 голосов
/ 23 января 2019

У меня есть программа для бинарного поиска на Java.Цикл «для каждого», по-видимому, не увеличивает переменную счетчика после ввода данных для массива.Тем не менее, он работает с обычным циклом for.Почему цикл «для каждого» не может увеличить счетчик в этой ситуации?

import java.util.Scanner;

public class binarySearch {
    public static int rank(int key, int[] a) {
        int lo = 0;
        int hi = a.length - 1;

        while (lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            if (key > a[mid])
                lo = mid + 1;
            else if (key < a[mid])
                hi = mid - 1;
            else
                return mid;
        }
        return -1;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the key to be searched");
        int key = in.nextInt();
        System.out.println("\nEnter the number of elements in the array");
        int num = in.nextInt();
        int[] array = new int[num];

        for (int counter : array) {
            System.out.println("Enter the element of the array!");
            array[counter] = in.nextInt();
        }
        int result = rank(key, array);
        if (result == -1) {
            System.out.println("\n The given key is not found!\n");
        } else {
            System.out.println("\n The given key is found at position : " + (result + 1));
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Вы только что создали массив, не заполняя его, поэтому он будет полон значений по умолчанию.Затем вы перебираете значения элементов массива, что означает, что значение counter будет каждый раз равным 0.Этот цикл:

for(int counter : array )
{
    System.out.println("Enter the element of the array!");
    array[counter] = in.nextInt();
}

... в целом эквивалентен этому:

for (int i = 0; i < array.length; i++) {
    // Note: this will always be zero because the array elements are all zero to start with
    int counter = array[i]; 
    System.out.println("Enter the element of the array!");
    array[counter] = in.nextInt();
}

На самом деле вы вообще не хотите перебирать исходные значения в массиве - вы простохотите перебрать от 0 до длины массива (исключая), что легко сделать с помощью цикла for:

for (int i = 0; i < array.length; i++) {
    System.out.println("Enter the element of the array!");
    array[i] = in.nextInt();
}
0 голосов
/ 23 января 2019

Цикл foreach выполняет итерации не по индексам массива, а по элементам массива.

0 голосов
/ 23 января 2019

Потому что в

    for(int counter : array )
    {
        System.out.println("Enter the element of the array!");
        array[counter] = in.nextInt();
    }

counter это не счетчик.Это значение из массива.

...