Сортировка массивов на JAVA

121
15 октября 2019, 00:20

Компилятор выдаёт ошибку:

переменные indexMin и indexMax могут быть не определены

Хотя механизм их определения, хоть и записан внутри if, но срабатывает при любом варианте заполнения массива. Как исправить?

/**
 *
 *  my third homework
 *
 */
import java.util.*;
import java.lang.*;
import java.io.*;
public class Main {
    public static void main(String[]args) {                
        // генерация массива
        int[] MyArr = new int[15];
        for(int i = 0; i< MyArr.length; i++) {
            MyArr[i] = (int) Math.round((Math.random() * 30) - 15);
            System.out.println(MyArr[i]);
        }
        int s = 0; // начало области
        int f = MyArr.length - 1; //конец области
        int indexMin, indexMax; // тут будут хранится индексы минимального и максимального значения в области
        int min = 16, max = -16;
        while (s<= f && f>= s) {
            // поиск наим и наиб значений в области и запись их индексов
            for(int i = 0; i< MyArr.length; i++) {
                if(MyArr[i] < min) {
                    min = MyArr[i];
                    indexMin = i;
                }
                if(MyArr[i] > max) {
                    max = MyArr[i];
                    indexMax = i;
                }
            }
            // перестановка занчений в начало и конец области
            MyArr[indexMin] = MyArr[s];
            MyArr[s] = min;
            MyArr[indexMax] = MyArr[f];
            MyArr[f] = max;
            // сброс значений минимума и максимума для поиска в новой области   (этого можно и не делать, т.к. первый и последний элементы массива уже минимальный и максимальный, просто перестраховка)
            min = 16;
            max = -16;
            // сужение области
            s++;
            f--;
        }
        System.out.println("после сортировки:");
        for(int i = 0; i< MyArr.length; i++) {                
            System.out.println(MyArr[i]);
        }
    }
}
Answer 1

Задайте начальное значение ваших indexMin и indexMax тут:

int indexMin, indexMax;

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

Answer 2

Если каждое значение вашего массива будет >= 16 или каждое значение будет <= -16, то одна из переменных у вас будет не инициализирована гарантировано.

От того что вы их проинициализируете нулевым значением ничего плохого не произойдет - внутри цикла ваша логика быстро сменит им значения на нужные.

Answer 3

Компилятор не отслеживает возможные варианты исполнения вашего кода. Если переменная инициализируется внутри условного оператора, а потом используется вне этого оператора, то компилятор предполагает, что условие может оказаться как истинным, так и ложным, а значит, при каких-то условиях переменная может оказаться неинициализированной. Использование неинициализированных локальных переменных в java запрещено, поэтому компилятор такой код не откомпилирует. Переменные экземпляра и переменные класса (т. е. описанные не внутри метода) по умолчанию приобретают нулевые значения, и их можно использовать без явной инициализации, но к локальным переменным (т.е. описанным внутри методов) это не относится, они всегда должны быть инициализованы явно. Так что присвойте им какие-нибудь начальные значения, напр.

    int indexMin = Integer.MAX_VALUE, indexMax = Integer.MIN_VALUE; 
READ ALSO
В чём здесь ошибка? [закрыт]

В чём здесь ошибка? [закрыт]

Вот кодПри компиляции выдаёт ошибки:

123
Добавление iFrame на PrimeFace страницу

Добавление iFrame на PrimeFace страницу

Вот в чем вопрос: хочу вывести iFrame с обзором pdf, написал сервлет который отвечает за высылку информации (так как сам pdf находится не в папке...

127
Как сделать эффект чтобы было понятно ,что скриншот сделан

Как сделать эффект чтобы было понятно ,что скриншот сделан

У меня есть кнопка которая делает скриншотКак сделать какой-то эффект, чтобы было понятно ,что скриншот сделан

130