Почему не могу передать из метода массив?

191
18 мая 2018, 00:10

Из-за объекста , как я думаю...Но как исправить не знаю.

import java.util.Scanner;
class Runners
{
  String name;
  double time;
  public static void main(String[] args)
  {
    System.out.println("Сколько всего бегунов?");
    Scanner scan = new Scanner(System.in);
     int number = scan.nextInt();

    if (number < 3)
    {
      System.out.print("Не может быть меньше 3 бегунов! ");
    }
    else
    {
        Runners[] run=new Runners[number];
        int x=0;
      while( x < run.length) {
        run[x]=new Runners();
       System.out.print("Фамилия бегуна?: ");
       run[x].name=scan.next();
       System.out.println("Время бегуна? ");
       run[x].time=scan.nextDouble();
      }
    }
   Sorting(Runners[]run ,int number);       // ошибка тут !!!!!!!!!!!!!
  }
  public void Sorting (Runners[]run ,int number){
        double resultsTMP;
        String sernameTMP;
        double minValue;
        int minValueInd;

         for (int i = 0; i<number; i++){
             minValue = run[i].time;
             minValueInd = i;
                for (int j = i + 1; j<number; j++) {
                  if (run[j].time < minValue) {
                      minValue = run[i].time;
                      minValueInd = j;
                    } 
                   }
            if (minValueInd != i) {
            resultsTMP = run[i].time;
            run[i].time = run[minValueInd].time;
            run[minValueInd].time = resultsTMP;
            sernameTMP = run[i].name;
           run[i].name = run[minValueInd].name;
            run[minValueInd].name = sernameTMP;
                 }
         }
         for (int i=0;i<3;i++){
         System.out.println((i+1)+" "+ run[i].name + " "+ run[i].time);}
  }
}
Answer 1
  1. Метод Sorting должен быть объявлен как static:

    public static void Sorting (Runners[] run ,int number)

  2. При передачи аргументов в метод уже не надо указывать повторно тип данных этих аргументов:

    Sorting(run , number); // пишется так

    Sorting(Runners[]run ,int number);// это ошибка

  3. Обьявлять инициализацию массива следует до цикла, а не в самом цикле while, так как после выхода из цикла массив больше не существует(читай про область видимости):

    String name; double time; public static void main(String[] args) {

    System.out.println("Сколько всего бегунов?");
    Scanner scan = new Scanner(System.in);
    int number = scan.nextInt();
    Runners[] run=new Runners[number]; // создавай тут
    if (number < 3)
    {
        System.out.print("Не может быть меньше 3 бегунов! ");
    }
    else
    {
    
        int x=0;
        while( x < run.length) {
            run[x]=new Runners();
            System.out.print("Фамилия бегуна?: ");
            run[x].name=scan.next();
            System.out.println("Время бегуна? ");
            run[x].time=scan.nextDouble();
        }
    }
    Sorting(run , number); // ошибка тут

    }

  4. В это строчке:

    while( x < run.length)

x будет всегда меньше и следовательно цикл будет бесконечным! в самом цикле напиши увеличение x на единицу!

В итоге получается рабочая программа:

    import java.util.Scanner;
class Runners
{
    String name;
    double time;
    public static void main(String[] args)
    {
        System.out.println("Сколько всего бегунов?");
        Scanner scan = new Scanner(System.in);
        int number = scan.nextInt();
        Runners[] run=new Runners[number];
        if (number < 3)
        {
            System.out.print("Не может быть меньше 3 бегунов! ");
        }
        else
        {

            int x=0;
            while( x < run.length) {
                run[x]=new Runners();
                System.out.print("Фамилия бегуна?: ");
                run[x].name=scan.next();
                System.out.println("Время бегуна? ");
                run[x].time=scan.nextDouble();
                x++;
            }
        }
        Sorting(run , number); // ошибка тут
    }
    public static void Sorting (Runners[] run ,int number){
        double resultsTMP;
        String sernameTMP;
        double minValue;
        int minValueInd;

        for (int i = 0; i<number; i++){
            minValue = run[i].time;
            minValueInd = i;
            for (int j = i + 1; j<number; j++) {
                if (run[j].time < minValue) {
                    minValue = run[i].time;
                    minValueInd = j;
                }
            }
            if (minValueInd != i) {
                resultsTMP = run[i].time;
                run[i].time = run[minValueInd].time;
                run[minValueInd].time = resultsTMP;
                sernameTMP = run[i].name;
                run[i].name = run[minValueInd].name;
                run[minValueInd].name = sernameTMP;
            }
        }
        for (int i=0;i<3;i++){
            System.out.println((i+1)+" "+ run[i].name + " "+ run[i].time);}
    }
}
READ ALSO
Связка spring + hibernate + log4j + mysql

Связка spring + hibernate + log4j + mysql

Стоит задача сделать простейшее взаимодействие между 4мя технологиямиТ

205
Gradle. Автозапуск тестов при сборке в IntelliJ IDEA

Gradle. Автозапуск тестов при сборке в IntelliJ IDEA

Gradle 47 не запускает юнит тесты пр нажатии на testClasses в InelliJ IDEA:

170