Улучшенный цикл для Java

Я пытаюсь написать цикл for для следующего целочисленного массива. Размер массива 10. Я написал два цикла. первый цикл увеличит значение, а второй цикл напечатает результат, например, элемент 1 равен 10, элемент 2 равен 20. Но я все время получаю 0. Я привел предыдущий код, в котором все было хорошо. По причине тестирования я хотел бы реализовать расширенный цикл for. Но я застрял с двумя проблемами: как увеличить значение и как определить длину массива. Вот мой код.

public static void main(String[] args) {

    int[] myIntArray = new int[10];

    for(Integer num: myIntArray){
        myIntArray[num]=num*10;
    }

    for(int num:myIntArray){
        System.out.println("Element " + num + ", value is " + myIntArray[num]);

    }
}

Предыдущий код

 int[] myIntArray =new int[10];

    for(int i =0; i<myIntArray.length;i++){
        myIntArray[i]=i*10;
    }
    for(int i=0;i<myIntArray.length;i++){
        System.out.println("Element " + i + ", value is " + myIntArray[i]);
    }
num*10 <- Как вы думаете, каково начальное значение num? Это 0, и поэтому все, что вы делаете, это умножаете что-то на 0.
OH GOD SPIDERS 25.04.2018 17:08

ты не задавал вопроса

SoroushA 25.04.2018 17:08
num*10 всегда является 0, потому что это значение по умолчанию для ints. Вы не поместили никаких элементов в свой массив, поэтому каждый элемент - это 0
QBrute 25.04.2018 17:08

При инициализации значение int по умолчанию равно 0. Вы умножаете 0 на что угодно, и он вернет 0

Sudheesh Singanamalla 25.04.2018 17:08

@SudheeshSinganamalla Я хочу написать array.lengh, но как я могу написать это в расширенном цикле for

TechoTek 25.04.2018 17:09

Вы хотите иметь массив на основе значения индекса? {0,1,2....,9} и умножить каждое значение в нем на 10?

Sudheesh Singanamalla 25.04.2018 17:11

нет у меня нет значения индекса

TechoTek 25.04.2018 17:11

То, что он называется «улучшенным», не означает, что он лучше для всего. Очевидно, что ваши требования намного лучше обслуживаются простым использованием обычного цикла for с переменной счетчика взаимодействий, поэтому просто используйте это.

OH GOD SPIDERS 25.04.2018 17:12

@SudheeshSinganamalla Я дал свой предыдущий код. Теперь я хочу реализовать то же самое в улучшенном цикле for. Но у меня всегда 0. предыдущий код работает нормально. Как я могу сделать это в расширенном цикле for

TechoTek 25.04.2018 17:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
508
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это простая математика. 0 * 10 = 0;)

Ваш массив int не инициализирован, и значение по умолчанию для примитива int равно 0. Если вы хотите предварительно установить его значениями на основе индекса, вам необходимо выполнить итерацию по массиву с использованием индекса или добавить его в цикл.

int index=0;
for(Integer num: myIntArray){
    myIntArray[index]=(++index)*10;

}

или же

for(int index=0;index<myIntArray.length;i++){
    myIntArray[i]=(i+1)*10;
}

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

Veselin Davidov 25.04.2018 17:10

1-й случай: число никогда не увеличивается, 2-й случай: число никогда не устанавливается и не увеличивается. Вероятно, почему вы проиграли

jhamon 25.04.2018 17:15

Это правильно! спасибо :) объяснение правильное, и это была моя вина. Я все еще не думаю, что заслуживаю 5 голосов против без единого слова. бу все равно;)

Veselin Davidov 25.04.2018 17:16

следующее редактирование: 1rst элемент не установлен в обоих случаях, оба случая вызовут исключение ArrayOutOfBoundException

jhamon 25.04.2018 17:16

Все они возвращают ноль, потому что при построении массива значение по умолчанию для каждого int в массиве равно нулю. Затем вы умножаете это на десять. Что все равно вернется как ноль. Перед использованием цикла for необходимо заполнить массив.

Обновлено:

После просмотра ваших правок я предлагаю не использовать для этого расширенный цикл for. Улучшенный цикл for - хороший инструмент при использовании в правильных ситуациях. Это автоматически не лучше, чем обычный цикл for, и решение, какой из них использовать, должно зависеть от ситуации.

int[] myIntArray =new int[10];, вы создаете массив из 10 элементов, и все эти элементы равны 0.

вот почему здесь:

for(Integer num: myIntArray){
    myIntArray[num]=num*10;
}

вы делаете больше как 0 * 10, что равно 0. Чтобы исправить это:

for(int i=0; i<myIntArray.length;i++){
    myIntArray[i]=i*10;
}

и отображать:

for(int num:myIntArray) {
    System.out.println("Element " + num + ", value is " + num);
}

Я дал свой предыдущий код, где все было хорошо. теперь я хочу написать это в расширенном цикле for. но я не смог добиться успеха

TechoTek 25.04.2018 17:15
Ответ принят как подходящий

Для начала нужно заполнить массив индексами:

    Arrays.setAll(myIntArray, i -> i);

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

public static void main(String[] args) {
    int[] myIntArray = new int[10];

    Arrays.setAll(myIntArray, i -> i);

    for(Integer num: myIntArray){
        myIntArray[num]=num*10;
    }

    for(int num : myIntArray){
        System.out.println("Element " + num/10 + ", value is " + num);

    }
}

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

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

Итак, для каждого написано так:

for(Integer num: myIntArray){
  myIntArray[num]=num*10;
}

Аналогично приведенному ниже, в случае ur:

for(int i =0; i<myIntArray.length;i++){
        myIntArray[i]=myIntArray[i]*10;
} 

И не используйте значение в массиве для индексации в стороне для каждого, так как это вызовет исключение индекса за пределами границ, если значение окажется> = длина массива. Здесь этого не произошло, поскольку значение в массиве имеет тип int, и все они инициализированы до 0, что меньше длины массива, 10.

for(int num:myIntArray){
    System.out.println("Element " + num + ", value is " + myIntArray[num]);
}

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